From 944eaa6d0563f755c63a6b411b5ec8ad01d9b740 Mon Sep 17 00:00:00 2001 From: Musacca <38190552+Musacca@users.noreply.github.com> Date: Wed, 22 Jan 2020 14:53:41 +0200 Subject: [PATCH 01/29] Temporal stability prediction graph with mock data --- src/components/chart/PredictionLineChart.js | 90 ++++++++++--------- src/components/chart/ScatterChartCard.js | 63 +++++++++++++ .../explanation/PredictionLineChartCard.js | 30 ------- .../explanation/TemporalStability.js | 51 +++++++++++ src/util/dataReducers.js | 16 +++- src/views/Explanation/Explanation.js | 7 +- 6 files changed, 183 insertions(+), 74 deletions(-) create mode 100644 src/components/chart/ScatterChartCard.js delete mode 100644 src/components/explanation/PredictionLineChartCard.js create mode 100644 src/components/explanation/TemporalStability.js diff --git a/src/components/chart/PredictionLineChart.js b/src/components/chart/PredictionLineChart.js index 4a140734..bcda7ac1 100644 --- a/src/components/chart/PredictionLineChart.js +++ b/src/components/chart/PredictionLineChart.js @@ -8,54 +8,64 @@ class PredictionLineChart extends React.Component { } render() { let graph = { - series: [{ - name: 'Value', - data: this.props.data - }], - options: { - chart: { - height: 50, - type: 'line', - toolbar: { - show: false - }, - zoom: { - enabled: false - } - }, - dataLabels: { - enabled: false - }, - stroke: { - curve: 'straight' - }, + options: { + chart: { + height: 350, + type: 'line', + + toolbar: { + show: false + } + }, + colors: ['#77B6EA', '#545454'], + dataLabels: { + enabled: false, + }, + stroke: { + curve: 'smooth' + }, + title: { + text: 'Average High & Low Temperature', + align: 'left' + }, + markers: { + size: 1 + }, + xaxis: { + min: 0, + max: this.props.data.length +1, + tickAmount: this.props.data.length +1, title: { - align: 'left' - }, - grid: { - row: { - colors: ['#f3f3f3', 'transparent'], // takes an array which will be repeated on columns - opacity: 0.5 - }, - }, - xaxis: { - categories: this.props.categories, - title: { - text: 'Event number', - }, + text: 'Month' + } + }, + yaxis: { + title: { + text: 'Prediction' }, - yaxis: { - title: { - text: 'Prediction value', - }, + min: -1, + max: 2, + tickAmount: 3, + labels: { + formatter: function (val, i) { + return val; + } } + }, + legend: { + position: 'top', + horizontalAlign: 'right', + floating: true, + offsetY: -25, + offsetX: -5 } - }; + }, + }; const height = 4 * 65; const chart = ( diff --git a/src/components/chart/ScatterChartCard.js b/src/components/chart/ScatterChartCard.js new file mode 100644 index 00000000..fddf5992 --- /dev/null +++ b/src/components/chart/ScatterChartCard.js @@ -0,0 +1,63 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import ReactApexChart from 'react-apexcharts'; + +const ScatterChartCard = props => { + let scatterChartState = { + series: [{ + data: props.data + }], + options: { + type: 'scatter', + chart: { + toolbar: { + show: false + }, + }, + tooltip: { + y: { + formatter: function (val) { + return val; + } + } + }, + yaxis: { + title: { + text: 'Prediction', + }, + tickAmount: 2, + min: 0, + max: 2, + axisBorder: { + show: true, + color: '#000000', + offsetX: 0, + offsetY: 0 + }, + }, + xaxis: { + min: 0, + max: props.data.length + 1, + tickAmount: props.data.length + 1, + title: { + text: 'Time', + }, + } + } + }; + + return ( + ); + }; + + ScatterChartCard.propTypes = { + data: PropTypes.arrayOf(PropTypes.any.isRequired).isRequired, + }; + + export default ScatterChartCard; diff --git a/src/components/explanation/PredictionLineChartCard.js b/src/components/explanation/PredictionLineChartCard.js deleted file mode 100644 index 12edc189..00000000 --- a/src/components/explanation/PredictionLineChartCard.js +++ /dev/null @@ -1,30 +0,0 @@ -import React from 'react'; -import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; -import PredictionLineChart from '../chart/PredictionLineChart'; -import PropTypes from 'prop-types'; -import {parsePredictionResultList} from '../../util/dataReducers'; - -const PredictionLineChartCard = (props) => { - const predictionData = parsePredictionResultList(props.data); - return - - - { props.traceId != '' && props.jobId != '' ? - 'Temporal stability result with trace id: '+ props.traceId +' and job id: '+ props.jobId: ''} - - -
- -
-
- -
; -}; -PredictionLineChartCard.propTypes = { - data: PropTypes.any.isRequired, - traceId: PropTypes.any, - jobId: PropTypes.any -}; -export default PredictionLineChartCard; diff --git a/src/components/explanation/TemporalStability.js b/src/components/explanation/TemporalStability.js new file mode 100644 index 00000000..b015f228 --- /dev/null +++ b/src/components/explanation/TemporalStability.js @@ -0,0 +1,51 @@ +import React from 'react'; +import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; +import PredictionLineChart from '../chart/PredictionLineChart'; +import PropTypes from 'prop-types'; +import {parseTemporalStabilityLimeResultList} from '../../util/dataReducers'; +import ScatterChartCard from '../chart/ScatterChartCard'; +import {Row} from 'react-grid-system'; + +const TemporalStability = (props) => { + const predictionData = parseTemporalStabilityLimeResultList(props.limeTemporalChartData); + + return
+ + + + + { props.traceId != '' && props.jobId != '' ? + 'Temporal stability result with trace id: '+ props.traceId +' and job id: '+ props.jobId: ''} + + +
+ +
+
+
+ + + + { props.traceId != '' && props.jobId != '' ? + 'Temporal stability result with trace id: '+ props.traceId +' and job id: '+ props.jobId: ''} + + +
+ +
+
+
+
+
+ ; +}; +TemporalStability.propTypes = { + limeTemporalChartData: PropTypes.any.isRequired, + predictionTemportalChartData: PropTypes.any.isRequired, + traceId: PropTypes.any, + jobId: PropTypes.any +}; +export default TemporalStability; diff --git a/src/util/dataReducers.js b/src/util/dataReducers.js index 1d057136..d6940280 100644 --- a/src/util/dataReducers.js +++ b/src/util/dataReducers.js @@ -283,7 +283,7 @@ export const parseLimeResult = (limeValueList) => { return ({labels: labels, values: values}); }; -export const parsePredictionResultList = (predictionList) => { +export const parseTemporalStabilityResultList = (predictionList) => { let data = []; let keys = Object.keys(predictionList); @@ -292,7 +292,19 @@ export const parsePredictionResultList = (predictionList) => { data.push(predictionList[keys[j]]); } } - return ({data: data, categories: keys}); + return ({data: data, categories: keys}); + }; + +export const parseTemporalStabilityLimeResultList = (predictionList) => { + let data = []; + let keys = Object.keys(predictionList); + + if (keys != null) { + for (let j = 0; j < keys.length; j++) { + data.push(predictionList[keys[j]]); + } + } + return ({data: [{data: data, name: 'prefix_1'}, {data: data, name: 'prefix_2'}], categories: keys}); }; export const getTraceAttributes = (traceList, selectedTrace) =>{ diff --git a/src/views/Explanation/Explanation.js b/src/views/Explanation/Explanation.js index 5e6a689f..18f17795 100644 --- a/src/views/Explanation/Explanation.js +++ b/src/views/Explanation/Explanation.js @@ -27,8 +27,9 @@ import PostHocExplanation from '../../components/explanation/post_hoc'; import TraceExplanation from '../../components/explanation/TraceExplanation'; import {getTraceIdsFromLogs, parseLimeResult} from '../../util/dataReducers'; import JobModelsTable from '../../components/explanation/JobModelsTable'; -import PredictionLineChartCard from '../../components/explanation/PredictionLineChartCard'; +import PredictionLineChartCard from '../../components/explanation/TemporalStability'; import {predictionListRequested} from '../../actions/PredictionAction'; +import ScatterChartCard from '../../components/chart/ScatterChartCard'; class Explanation extends Component { constructor(props) { @@ -143,7 +144,9 @@ class Explanation extends Component {
From daefed491f7f9a32ce3f42ce97f870c7fa8705c9 Mon Sep 17 00:00:00 2001 From: Musacca <38190552+Musacca@users.noreply.github.com> Date: Wed, 22 Jan 2020 16:26:46 +0200 Subject: [PATCH 02/29] Temporal stability lime graph with mock data --- src/components/chart/PredictionLineChart.js | 11 +- .../explanation/TemporalStability.js | 13 +- src/mock_data/lime_temp_stability.json | 161 + src/mock_data/prediction_temp_stability.json | 5630 +++++++++++++++++ src/util/dataReducers.js | 50 +- src/views/Explanation/Explanation.js | 9 +- 6 files changed, 5842 insertions(+), 32 deletions(-) create mode 100644 src/mock_data/lime_temp_stability.json create mode 100644 src/mock_data/prediction_temp_stability.json diff --git a/src/components/chart/PredictionLineChart.js b/src/components/chart/PredictionLineChart.js index bcda7ac1..3d46db34 100644 --- a/src/components/chart/PredictionLineChart.js +++ b/src/components/chart/PredictionLineChart.js @@ -8,6 +8,11 @@ class PredictionLineChart extends React.Component { } render() { let graph = { + series: [ + {name: "prefix_1", + data: [-0.1376, 0.0487, 0.2555, 0.3617, -0.394, -0.2556] + } + ], options: { chart: { height: 350, @@ -17,7 +22,6 @@ class PredictionLineChart extends React.Component { show: false } }, - colors: ['#77B6EA', '#545454'], dataLabels: { enabled: false, }, @@ -25,7 +29,6 @@ class PredictionLineChart extends React.Component { curve: 'smooth' }, title: { - text: 'Average High & Low Temperature', align: 'left' }, markers: { @@ -36,7 +39,7 @@ class PredictionLineChart extends React.Component { max: this.props.data.length +1, tickAmount: this.props.data.length +1, title: { - text: 'Month' + text: 'Time' } }, yaxis: { @@ -56,8 +59,6 @@ class PredictionLineChart extends React.Component { position: 'top', horizontalAlign: 'right', floating: true, - offsetY: -25, - offsetX: -5 } }, }; diff --git a/src/components/explanation/TemporalStability.js b/src/components/explanation/TemporalStability.js index b015f228..d9bdd264 100644 --- a/src/components/explanation/TemporalStability.js +++ b/src/components/explanation/TemporalStability.js @@ -2,12 +2,15 @@ import React from 'react'; import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; import PredictionLineChart from '../chart/PredictionLineChart'; import PropTypes from 'prop-types'; -import {parseTemporalStabilityLimeResultList} from '../../util/dataReducers'; +import {parseTemporalStabilityLimeResultList, parseTemporalStabilityPredictionResultList} +from '../../util/dataReducers'; import ScatterChartCard from '../chart/ScatterChartCard'; import {Row} from 'react-grid-system'; const TemporalStability = (props) => { - const predictionData = parseTemporalStabilityLimeResultList(props.limeTemporalChartData); + const temporalStabilityLimeResult = parseTemporalStabilityLimeResultList(props.limeTemporalChartData, '00000912'); + const temporalStabilityPredictionResult = + parseTemporalStabilityPredictionResultList(props.predictionTemportalChartData, '00000916'); return
@@ -20,7 +23,7 @@ const TemporalStability = (props) => {
+ data = {temporalStabilityPredictionResult}/>
@@ -33,8 +36,8 @@ const TemporalStability = (props) => {
+ data = {temporalStabilityLimeResult.data} + categories = {temporalStabilityLimeResult.categories}/>
diff --git a/src/mock_data/lime_temp_stability.json b/src/mock_data/lime_temp_stability.json new file mode 100644 index 00000000..fcfafcc5 --- /dev/null +++ b/src/mock_data/lime_temp_stability.json @@ -0,0 +1,161 @@ + +{ + "00000912": { + "prefix_1": { + "prefix_5": { + "value": "", + "importance": -0.3940 + }, + "prefix_4": { + "value": "", + "importance": 0.3617 + }, + "prefix_6": { + "value": "", + "importance": -0.2556 + }, + "prefix_3": { + "value": "", + "importance": 0.2555 + }, + "prefix_1": { + "value": "assumption laboratory", + "importance": -0.1376 + }, + "prefix_2": { + "value": "", + "importance": 0.0487 + } + }, + "prefix_2": { + "prefix_5": { + "value": "", + "importance": -0.3982 + }, + "prefix_4": { + "value": "", + "importance": 0.3659 + }, + "prefix_3": { + "value": "", + "importance": 0.2504 + }, + "prefix_6": { + "value": "", + "importance": -0.2432 + }, + "prefix_1": { + "value": "assumption laboratory", + "importance": -0.1728 + }, + "prefix_2": { + "value": "assumption laboratory", + "importance": 0.0185 + } + }, + "prefix_3": { + "prefix_5": { + "value": "", + "importance": -0.4257 + }, + "prefix_4": { + "value": "", + "importance": 0.3563 + }, + "prefix_6": { + "value": "", + "importance": -0.2771 + }, + "prefix_1": { + "value": "assumption laboratory", + "importance": -0.1742 + }, + "prefix_2": { + "value": "assumption laboratory", + "importance": 0.0261 + }, + "prefix_3": { + "value": "assumption laboratory", + "importance": -0.0122 + } + }, + "prefix_4": { + "prefix_5": { + "value": "", + "importance": -0.4123 + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "importance": -0.3366 + }, + "prefix_6": { + "value": "", + "importance": -0.2850 + }, + "prefix_1": { + "value": "assumption laboratory", + "importance": -0.1372 + }, + "prefix_2": { + "value": "assumption laboratory", + "importance": 0.0221 + }, + "prefix_3": { + "value": "assumption laboratory", + "importance": -0.0186 + } + }, + "prefix_5": { + "prefix_4": { + "value": "unconjugated bilirubin", + "importance": -0.3972 + }, + "prefix_6": { + "value": "", + "importance": -0.2697 + }, + "prefix_5": { + "value": "bilirubin - total", + "importance": 0.2425 + }, + "prefix_1": { + "value": "assumption laboratory", + "importance": -0.1511 + }, + "prefix_3": { + "value": "assumption laboratory", + "importance": -0.0348 + }, + "prefix_2": { + "value": "assumption laboratory", + "importance": 0.0185 + } + }, + "prefix_6": { + "prefix_4": { + "value": "unconjugated bilirubin", + "importance": -0.4288 + }, + "prefix_6": { + "value": "glucose", + "importance": 0.2189 + }, + "prefix_1": { + "value": "assumption laboratory", + "importance": -0.1775 + }, + "prefix_5": { + "value": "bilirubin - total", + "importance": 0.1382 + }, + "prefix_2": { + "value": "assumption laboratory", + "importance": 0.0370 + }, + "prefix_3": { + "value": "assumption laboratory", + "importance": -0.0039 + } + } + } +} diff --git a/src/mock_data/prediction_temp_stability.json b/src/mock_data/prediction_temp_stability.json new file mode 100644 index 00000000..618f2410 --- /dev/null +++ b/src/mock_data/prediction_temp_stability.json @@ -0,0 +1,5630 @@ +{ + "00000924": { + "prefix_1": { + "value": "cytology - vagina -", + "predicted": "true" + }, + "prefix_2": { + "value": "outpatient follow-up consultation", + "predicted": "false" + }, + "prefix_3": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_4": { + "value": "telephone consultation", + "predicted": "false" + } + }, + "00001089": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000916": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "unconjugated bilirubin", + "predicted": "true" + } + }, + "00000971": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "compartment for inspection", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "unconjugated bilirubin", + "predicted": "true" + } + }, + "00001011": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_4": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_5": { + "value": "glucose", + "predicted": "false" + }, + "prefix_6": { + "value": "urea", + "predicted": "true" + } + }, + "00000946": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001004": { + "prefix_1": { + "value": "ultrasound - internal genitals", + "predicted": "true" + }, + "prefix_2": { + "value": "immuno-pathology", + "predicted": "true" + }, + "prefix_3": { + "value": "histological examination - biopsies nno", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "hemoglobin photoelectric", + "predicted": "true" + } + }, + "00001035": { + "prefix_1": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "true" + }, + "prefix_2": { + "value": "histological examination - biopsies nno", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "unconjugated bilirubin", + "predicted": "true" + } + }, + "00001038": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "0", + "predicted": "false" + }, + "prefix_3": { + "value": "0", + "predicted": "false" + }, + "prefix_4": { + "value": "0", + "predicted": "false" + }, + "prefix_5": { + "value": "order rate", + "predicted": "true" + }, + "prefix_6": { + "value": "0", + "predicted": "true" + } + }, + "00000940": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000954": { + "prefix_1": { + "value": "thorax", + "predicted": "true" + }, + "prefix_2": { + "value": "First outpatient consultation", + "predicted": "true" + }, + "prefix_3": { + "value": "0", + "predicted": "true" + }, + "prefix_4": { + "value": "0", + "predicted": "true" + }, + "prefix_5": { + "value": "0", + "predicted": "true" + }, + "prefix_6": { + "value": "0", + "predicted": "true" + } + }, + "00000939": { + "prefix_1": { + "value": "telephone consultation", + "predicted": "true" + }, + "prefix_2": { + "value": "outpatient follow-up consultation", + "predicted": "true" + }, + "prefix_3": { + "value": "administrative fee - the first pol", + "predicted": "false" + } + }, + "00000970": { + "prefix_1": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "true" + }, + "prefix_2": { + "value": "histological examination - biopsies nno", + "predicted": "false" + }, + "prefix_3": { + "value": "cito histological examination", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "unconjugated bilirubin", + "predicted": "true" + } + }, + "00001054": { + "prefix_1": { + "value": "ultrasound - internal genitals", + "predicted": "true" + }, + "prefix_2": { + "value": "cytology - ectocervix -", + "predicted": "true" + }, + "prefix_3": { + "value": "First outpatient consultation", + "predicted": "true" + }, + "prefix_4": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_5": { + "value": "immuno-pathology", + "predicted": "true" + }, + "prefix_6": { + "value": "0", + "predicted": "true" + } + }, + "00001123": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_3": { + "value": "compartment for inspection", + "predicted": "false" + }, + "prefix_4": { + "value": "0", + "predicted": "false" + }, + "prefix_5": { + "value": "0", + "predicted": "false" + } + }, + "00001000": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_3": { + "value": "telephone consultation", + "predicted": "false" + }, + "prefix_4": { + "value": "outpatient follow-up consultation", + "predicted": "false" + } + }, + "00001128": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "compartment for inspection", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "unconjugated bilirubin", + "predicted": "true" + } + }, + "00001138": { + "prefix_1": { + "value": "ultrasound - internal genitals", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000922": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "hemoglobin photoelectric", + "predicted": "false" + }, + "prefix_4": { + "value": "ABO blood group and rhesus factor", + "predicted": "false" + }, + "prefix_5": { + "value": "rhesus factor d - Centrifuge method - email", + "predicted": "true" + }, + "prefix_6": { + "value": "0", + "predicted": "true" + } + }, + "00001072": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001076": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001039": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000995": { + "prefix_1": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001126": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_4": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_5": { + "value": "glucose", + "predicted": "false" + }, + "prefix_6": { + "value": "urea", + "predicted": "true" + } + }, + "00001101": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "outpatient follow-up consultation", + "predicted": "false" + }, + "prefix_3": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_4": { + "value": "administrative fee - the first pol", + "predicted": "false" + } + }, + "00000936": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "compartment for inspection", + "predicted": "true" + }, + "prefix_3": { + "value": "cytology - ectocervix -", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "assumption laboratory", + "predicted": "false" + } + }, + "00000976": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_3": { + "value": "compartment for inspection", + "predicted": "false" + }, + "prefix_4": { + "value": "e.c.g. - Electrocardiography", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "assumption laboratory", + "predicted": "false" + } + }, + "00000950": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001018": { + "prefix_1": { + "value": "cytology - vagina -", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001069": { + "prefix_1": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "urea", + "predicted": "true" + } + }, + "00001142": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001083": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001098": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001115": { + "prefix_1": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "true" + }, + "prefix_2": { + "value": "0", + "predicted": "true" + }, + "prefix_3": { + "value": "0", + "predicted": "true" + }, + "prefix_4": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "false" + }, + "prefix_5": { + "value": "histological examination - biopsies nno", + "predicted": "true" + }, + "prefix_6": { + "value": "cito histological examination", + "predicted": "true" + } + }, + "00000985": { + "prefix_1": { + "value": "ultrasound - internal genitals", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000914": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001033": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001102": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000988": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001081": { + "prefix_1": { + "value": "outpatient follow-up consultation", + "predicted": "true" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "true" + }, + "prefix_3": { + "value": "thorax", + "predicted": "false" + }, + "prefix_4": { + "value": "0", + "predicted": "false" + }, + "prefix_5": { + "value": "telephone consultation", + "predicted": "true" + }, + "prefix_6": { + "value": "assumption laboratory", + "predicted": "true" + } + }, + "00001111": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001002": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_3": { + "value": "compartment for inspection", + "predicted": "false" + }, + "prefix_4": { + "value": "telephone consultation", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "assumption laboratory", + "predicted": "false" + } + }, + "00000961": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001051": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_3": { + "value": "administrative fee - the first pol", + "predicted": "false" + } + }, + "00001124": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "unconjugated bilirubin", + "predicted": "true" + } + }, + "00000945": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_3": { + "value": "0", + "predicted": "false" + }, + "prefix_4": { + "value": "0", + "predicted": "false" + }, + "prefix_5": { + "value": "0", + "predicted": "false" + }, + "prefix_6": { + "value": "First outpatient consultation", + "predicted": "true" + } + }, + "00000956": { + "prefix_1": { + "value": "ultrasound - internal genitals", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000955": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001010": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001014": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000949": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "unconjugated bilirubin", + "predicted": "true" + } + }, + "00001052": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000920": { + "prefix_1": { + "value": "0", + "predicted": "false" + } + }, + "00001103": { + "prefix_1": { + "value": "outpatient follow-up consultation", + "predicted": "true" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "true" + }, + "prefix_3": { + "value": "telephone consultation", + "predicted": "false" + } + }, + "00001104": { + "prefix_1": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001136": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000984": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_4": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_5": { + "value": "glucose", + "predicted": "false" + }, + "prefix_6": { + "value": "urea", + "predicted": "true" + } + }, + "00001129": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "0", + "predicted": "false" + }, + "prefix_4": { + "value": "0", + "predicted": "false" + }, + "prefix_5": { + "value": "order rate", + "predicted": "true" + }, + "prefix_6": { + "value": "First outpatient consultation", + "predicted": "true" + } + }, + "00000977": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001012": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_3": { + "value": "compartment for inspection", + "predicted": "false" + }, + "prefix_4": { + "value": "telephone consultation", + "predicted": "false" + }, + "prefix_5": { + "value": "telephone consultation", + "predicted": "false" + } + }, + "00000944": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "outpatient follow-up consultation", + "predicted": "false" + }, + "prefix_3": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_4": { + "value": "telephone consultation", + "predicted": "false" + }, + "prefix_5": { + "value": "telephone consultation", + "predicted": "false" + } + }, + "00001057": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001114": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "0", + "predicted": "false" + }, + "prefix_5": { + "value": "urea", + "predicted": "true" + }, + "prefix_6": { + "value": "hemoglobin photoelectric", + "predicted": "true" + } + }, + "00000947": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_3": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_4": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_5": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "true" + }, + "prefix_6": { + "value": "190021 clinical admission A002", + "predicted": "true" + } + }, + "00000990": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000962": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001090": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001008": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "0", + "predicted": "false" + }, + "prefix_3": { + "value": "0", + "predicted": "false" + }, + "prefix_4": { + "value": "0", + "predicted": "false" + }, + "prefix_5": { + "value": "order rate", + "predicted": "true" + }, + "prefix_6": { + "value": "0", + "predicted": "true" + } + }, + "00001131": { + "prefix_1": { + "value": "ultrasound - internal genitals", + "predicted": "true" + }, + "prefix_2": { + "value": "thorax", + "predicted": "true" + }, + "prefix_3": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_4": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_5": { + "value": "thorax", + "predicted": "true" + }, + "prefix_6": { + "value": "ct abdomen", + "predicted": "true" + } + }, + "00000959": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000926": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000996": { + "prefix_1": { + "value": "ultrasound - internal genitals", + "predicted": "true" + }, + "prefix_2": { + "value": "cytology - ectocervix -", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "0", + "predicted": "false" + }, + "prefix_6": { + "value": "bacteriological examination of breeding nie", + "predicted": "false" + } + }, + "00001141": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001060": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001080": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001044": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_3": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_4": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_5": { + "value": "thorax", + "predicted": "true" + }, + "prefix_6": { + "value": "First outpatient consultation", + "predicted": "true" + } + }, + "00001059": { + "prefix_1": { + "value": "ultrasound - internal genitals", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001074": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001026": { + "prefix_1": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "assumption laboratory", + "predicted": "false" + } + }, + "00001109": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + } + }, + "00001053": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "cytology - ectocervix -", + "predicted": "false" + }, + "prefix_3": { + "value": "histological examination - biopsies nno", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "assumption laboratory", + "predicted": "false" + } + }, + "00000951": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "ultrasound - internal genitals", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "unconjugated bilirubin", + "predicted": "true" + } + }, + "00000933": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001029": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001112": { + "prefix_1": { + "value": "histological examination - biopsies nno", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000969": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "compartment for inspection", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "unconjugated bilirubin", + "predicted": "true" + } + }, + "00000921": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000928": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001041": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001047": { + "prefix_1": { + "value": "thorax", + "predicted": "true" + }, + "prefix_2": { + "value": "First outpatient consultation", + "predicted": "true" + }, + "prefix_3": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_4": { + "value": "ct abdomen", + "predicted": "false" + }, + "prefix_5": { + "value": "compartment for inspection", + "predicted": "false" + } + }, + "00001139": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001067": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "ca-125 using meia", + "predicted": "false" + }, + "prefix_3": { + "value": "order rate", + "predicted": "false" + }, + "prefix_4": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_5": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_6": { + "value": "telephone consultation", + "predicted": "true" + } + }, + "00000930": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000934": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000963": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_4": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_5": { + "value": "glucose", + "predicted": "false" + }, + "prefix_6": { + "value": "urea", + "predicted": "true" + } + }, + "00001019": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001025": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001042": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001058": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001130": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001132": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001050": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001119": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001046": { + "prefix_1": { + "value": "cytology - vagina -", + "predicted": "true" + }, + "prefix_2": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_3": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_4": { + "value": "telephone consultation", + "predicted": "false" + } + }, + "00001110": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "0", + "predicted": "false" + }, + "prefix_3": { + "value": "histological examination - biopsies nno", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "assumption laboratory", + "predicted": "false" + } + }, + "00001037": { + "prefix_1": { + "value": "cytology - ectocervix -", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000968": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_3": { + "value": "chest ct", + "predicted": "false" + }, + "prefix_4": { + "value": "telephone consultation", + "predicted": "false" + } + }, + "00001096": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000941": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001122": { + "prefix_1": { + "value": "ultrasound - internal genitals", + "predicted": "true" + }, + "prefix_2": { + "value": "histological examination - biopsies nno", + "predicted": "true" + }, + "prefix_3": { + "value": "histological examination - biopsies nno", + "predicted": "false" + }, + "prefix_4": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_5": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_6": { + "value": "0", + "predicted": "false" + } + }, + "00001107": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_3": { + "value": "compartment for inspection", + "predicted": "false" + } + }, + "00000932": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001108": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000979": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_5": { + "value": "hemoglobin photoelectric", + "predicted": "true" + }, + "prefix_6": { + "value": "creatinine", + "predicted": "true" + } + }, + "00001001": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "0", + "predicted": "false" + } + }, + "00000964": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001036": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001117": { + "prefix_1": { + "value": "ultrasound - internal genitals", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001020": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001133": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + } + }, + "00000991": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000986": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001003": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_3": { + "value": "telephone consultation", + "predicted": "false" + }, + "prefix_4": { + "value": "outpatient follow-up consultation", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "assumption laboratory", + "predicted": "false" + } + }, + "00001140": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001031": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001106": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000915": { + "prefix_1": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000942": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "compartment for inspection", + "predicted": "false" + }, + "prefix_3": { + "value": "histological examination - biopsies nno", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "assumption laboratory", + "predicted": "false" + } + }, + "00001078": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001137": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001009": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001013": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_3": { + "value": "compartment for inspection", + "predicted": "false" + }, + "prefix_4": { + "value": "outpatient follow-up consultation", + "predicted": "false" + }, + "prefix_5": { + "value": "outpatient follow-up consultation", + "predicted": "false" + }, + "prefix_6": { + "value": "simulator - use before megavol", + "predicted": "true" + } + }, + "00001023": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_4": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_5": { + "value": "glucose", + "predicted": "false" + }, + "prefix_6": { + "value": "urea", + "predicted": "true" + } + }, + "00001048": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000925": { + "prefix_1": { + "value": "cytology - ectocervix -", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001116": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "compartment for inspection", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "unconjugated bilirubin", + "predicted": "true" + } + }, + "00000952": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_3": { + "value": "compartment for inspection", + "predicted": "false" + }, + "prefix_4": { + "value": "cito histological examination", + "predicted": "false" + }, + "prefix_5": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_6": { + "value": "administrative fee - the first pol", + "predicted": "false" + } + }, + "00001093": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000997": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + } + }, + "00001085": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "histological examination - biopsies nno", + "predicted": "false" + }, + "prefix_3": { + "value": "cito histological examination", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "assumption laboratory", + "predicted": "false" + } + }, + "00000923": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000938": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001045": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001055": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_4": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_5": { + "value": "glucose", + "predicted": "false" + }, + "prefix_6": { + "value": "urea", + "predicted": "true" + } + }, + "00000966": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000931": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + } + }, + "00001049": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001100": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000958": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "cytology - ectocervix -", + "predicted": "false" + }, + "prefix_3": { + "value": "histological examination - biopsies nno", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "assumption laboratory", + "predicted": "false" + } + }, + "00001087": { + "prefix_1": { + "value": "outpatient follow-up consultation", + "predicted": "true" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "true" + }, + "prefix_3": { + "value": "0", + "predicted": "true" + }, + "prefix_4": { + "value": "telephone consultation", + "predicted": "false" + } + }, + "00001088": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_4": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_5": { + "value": "glucose", + "predicted": "false" + }, + "prefix_6": { + "value": "urea", + "predicted": "true" + } + }, + "00001120": { + "prefix_1": { + "value": "ultrasound - internal genitals", + "predicted": "true" + }, + "prefix_2": { + "value": "cytology - vagina -", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "urea", + "predicted": "true" + }, + "prefix_6": { + "value": "hemoglobin photoelectric", + "predicted": "true" + } + }, + "00001021": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000974": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_3": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_4": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_5": { + "value": "0", + "predicted": "false" + }, + "prefix_6": { + "value": "ct abdomen", + "predicted": "false" + } + }, + "00001079": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001005": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001062": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000929": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000978": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000975": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000980": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_4": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_5": { + "value": "glucose", + "predicted": "false" + }, + "prefix_6": { + "value": "urea", + "predicted": "true" + } + }, + "00001024": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000927": { + "prefix_1": { + "value": "outpatient follow-up consultation", + "predicted": "true" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "true" + } + }, + "00000953": { + "prefix_1": { + "value": "outpatient follow-up consultation", + "predicted": "true" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "true" + }, + "prefix_3": { + "value": "0", + "predicted": "true" + }, + "prefix_4": { + "value": "telephone consultation", + "predicted": "false" + }, + "prefix_5": { + "value": "outpatient follow-up consultation", + "predicted": "false" + } + }, + "00000918": { + "prefix_1": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "true" + }, + "prefix_2": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "false" + }, + "prefix_3": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "assumption laboratory", + "predicted": "false" + } + }, + "00001022": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001134": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "ca-125 using meia", + "predicted": "false" + }, + "prefix_3": { + "value": "order rate", + "predicted": "false" + }, + "prefix_4": { + "value": "outpatient follow-up consultation", + "predicted": "false" + }, + "prefix_5": { + "value": "telephone consultation", + "predicted": "false" + } + }, + "00001040": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000989": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_4": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_5": { + "value": "glucose", + "predicted": "false" + }, + "prefix_6": { + "value": "urea", + "predicted": "true" + } + }, + "00001075": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + } + }, + "00001077": { + "prefix_1": { + "value": "histological examination - biopsies nno", + "predicted": "true" + }, + "prefix_2": { + "value": "0", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "unconjugated bilirubin", + "predicted": "true" + } + }, + "00001092": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000948": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000917": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001015": { + "prefix_1": { + "value": "histological examination - biopsies nno", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001091": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_4": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_5": { + "value": "glucose", + "predicted": "false" + }, + "prefix_6": { + "value": "urea", + "predicted": "true" + } + }, + "00000935": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001030": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001105": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001095": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "glucose", + "predicted": "true" + }, + "prefix_6": { + "value": "urea", + "predicted": "true" + } + }, + "00001016": { + "prefix_1": { + "value": "outpatient follow-up consultation", + "predicted": "true" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "true" + } + }, + "00001113": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "unconjugated bilirubin", + "predicted": "true" + } + }, + "00001084": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001032": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "cytology - ectocervix -", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "unconjugated bilirubin", + "predicted": "true" + } + }, + "00000919": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001034": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000960": { + "prefix_1": { + "value": "ultrasound - internal genitals", + "predicted": "true" + }, + "prefix_2": { + "value": "First outpatient consultation", + "predicted": "true" + }, + "prefix_3": { + "value": "administrative fee - the first pol", + "predicted": "true" + }, + "prefix_4": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "false" + }, + "prefix_5": { + "value": "190205 Class 3b A205", + "predicted": "false" + }, + "prefix_6": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "false" + } + }, + "00001066": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_4": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_5": { + "value": "glucose", + "predicted": "false" + }, + "prefix_6": { + "value": "urea", + "predicted": "true" + } + }, + "00001086": { + "prefix_1": { + "value": "telephone consultation", + "predicted": "true" + }, + "prefix_2": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "urea", + "predicted": "true" + } + }, + "00000973": { + "prefix_1": { + "value": "histological examination - biopsies nno", + "predicted": "true" + }, + "prefix_2": { + "value": "First outpatient consultation", + "predicted": "true" + }, + "prefix_3": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_4": { + "value": "e.c.g. - Electrocardiography", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "0", + "predicted": "false" + } + }, + "00001097": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001099": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000912": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000937": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001064": { + "prefix_1": { + "value": "ultrasound - internal genitals", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001065": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + } + }, + "00001027": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000999": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "compartment for inspection", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "unconjugated bilirubin", + "predicted": "true" + } + }, + "00001056": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "squamous cell carcinoma using eia", + "predicted": "false" + }, + "prefix_3": { + "value": "order rate", + "predicted": "false" + }, + "prefix_4": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_5": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_6": { + "value": "MRI abdomen", + "predicted": "false" + } + }, + "00001070": { + "prefix_1": { + "value": "0", + "predicted": "false" + }, + "prefix_2": { + "value": "cytology - ectocervix -", + "predicted": "false" + }, + "prefix_3": { + "value": "histological examination - biopsies nno", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "assumption laboratory", + "predicted": "false" + } + }, + "00001073": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000981": { + "prefix_1": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "true" + }, + "prefix_2": { + "value": "0", + "predicted": "true" + }, + "prefix_3": { + "value": "0", + "predicted": "true" + }, + "prefix_4": { + "value": "0", + "predicted": "true" + }, + "prefix_5": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "true" + }, + "prefix_6": { + "value": "assumption laboratory", + "predicted": "true" + } + }, + "00001082": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_3": { + "value": "outpatient follow-up consultation", + "predicted": "false" + } + }, + "00000965": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_4": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_5": { + "value": "glucose", + "predicted": "false" + }, + "prefix_6": { + "value": "urea", + "predicted": "true" + } + }, + "00001094": { + "prefix_1": { + "value": "cytology - ectocervix -", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001028": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000972": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001043": { + "prefix_1": { + "value": "ultrasound - internal genitals", + "predicted": "true" + }, + "prefix_2": { + "value": "First outpatient consultation", + "predicted": "true" + }, + "prefix_3": { + "value": "administrative fee - the first pol", + "predicted": "true" + }, + "prefix_4": { + "value": "telephone consultation", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "CEA - tumor marker using meia", + "predicted": "false" + } + }, + "00001061": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001071": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001125": { + "prefix_1": { + "value": "histological examination - biopsies nno", + "predicted": "true" + }, + "prefix_2": { + "value": "0", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "unconjugated bilirubin", + "predicted": "true" + } + }, + "00001017": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00000982": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000957": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001121": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001006": { + "prefix_1": { + "value": "e.c.g. - Electrocardiography", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001135": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00000967": { + "prefix_1": { + "value": "histological examination - biopsies nno", + "predicted": "true" + }, + "prefix_2": { + "value": "First outpatient consultation", + "predicted": "true" + }, + "prefix_3": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "0", + "predicted": "false" + }, + "prefix_6": { + "value": "0", + "predicted": "false" + } + }, + "00000983": { + "prefix_1": { + "value": "thorax", + "predicted": "true" + }, + "prefix_2": { + "value": "First outpatient consultation", + "predicted": "true" + }, + "prefix_3": { + "value": "administrative fee - the first pol", + "predicted": "false" + }, + "prefix_4": { + "value": "ct abdomen", + "predicted": "false" + }, + "prefix_5": { + "value": "outpatient follow-up consultation", + "predicted": "true" + } + }, + "00000998": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001063": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001118": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001007": { + "prefix_1": { + "value": "ultrasound - internal genitals", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "hemoglobin photoelectric", + "predicted": "false" + }, + "prefix_5": { + "value": "creatinine", + "predicted": "false" + }, + "prefix_6": { + "value": "0", + "predicted": "false" + } + }, + "00000943": { + "prefix_1": { + "value": "ultrasound - internal genitals", + "predicted": "true" + }, + "prefix_2": { + "value": "histological examination - biopsies nno", + "predicted": "true" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_6": { + "value": "unconjugated bilirubin", + "predicted": "true" + } + }, + "00000987": { + "prefix_1": { + "value": "demurrage - all spec.beh.kinderg.-Reval.", + "predicted": "true" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_5": { + "value": "unconjugated bilirubin", + "predicted": "true" + }, + "prefix_6": { + "value": "bilirubin - total", + "predicted": "true" + } + }, + "00001068": { + "prefix_1": { + "value": "First outpatient consultation", + "predicted": "false" + }, + "prefix_2": { + "value": "administrative fee - the first pol", + "predicted": "false" + } + }, + "00000913": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + }, + "00001127": { + "prefix_1": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_2": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_3": { + "value": "assumption laboratory", + "predicted": "false" + }, + "prefix_4": { + "value": "unconjugated bilirubin", + "predicted": "false" + }, + "prefix_5": { + "value": "bilirubin - total", + "predicted": "false" + }, + "prefix_6": { + "value": "glucose", + "predicted": "false" + } + } +} diff --git a/src/util/dataReducers.js b/src/util/dataReducers.js index d6940280..c6f43841 100644 --- a/src/util/dataReducers.js +++ b/src/util/dataReducers.js @@ -283,28 +283,44 @@ export const parseLimeResult = (limeValueList) => { return ({labels: labels, values: values}); }; -export const parseTemporalStabilityResultList = (predictionList) => { - let data = []; - let keys = Object.keys(predictionList); - - if (keys != null) { - for (let j = 0; j < keys.length; j++) { - data.push(predictionList[keys[j]]); +export const parseTemporalStabilityLimeResultList = (predictionList, traceId) => { + let data = [[]]; + let labels = [[]]; + let prefixs = []; + if (predictionList[traceId] != null || predictionList[traceId] != undefined) { + const traceAttr = predictionList[traceId]; + prefixs = Object.keys(traceAttr); + for (let j = 0; j < prefixs.length; j++) { + let arr = []; + const prefixValues = traceAttr[prefixs[j]]; + for (let k = 1; k <= Object.keys(prefixValues).length; k++) { + const value = prefixValues['prefix_'+k]; + // console.log("Heer" +value); + arr.push(value['importance']); + // labels[j].push(value['value']); } + data.push({name: prefixs[j], data: arr}); } - return ({data: data, categories: keys}); + data.shift(); + } + return ({data: data, categories: prefixs}); }; -export const parseTemporalStabilityLimeResultList = (predictionList) => { - let data = []; - let keys = Object.keys(predictionList); - - if (keys != null) { - for (let j = 0; j < keys.length; j++) { - data.push(predictionList[keys[j]]); - } +export const parseTemporalStabilityPredictionResultList = (predictionList, traceId) => { + let predictions = []; + let prefixs = []; + if (predictionList[traceId] != null || predictionList[traceId] != undefined) { + const traceAttr = predictionList[traceId]; + prefixs = Object.keys(traceAttr); + for (let j = 0; j < prefixs.length; j++) { + const prediction = traceAttr[prefixs[j]]['predicted']; + if (prediction == 'true') { + predictions.push(2); + } else predictions.push(1); } - return ({data: [{data: data, name: 'prefix_1'}, {data: data, name: 'prefix_2'}], categories: keys}); + } + + return predictions; }; export const getTraceAttributes = (traceList, selectedTrace) =>{ diff --git a/src/views/Explanation/Explanation.js b/src/views/Explanation/Explanation.js index 18f17795..9f9ae22d 100644 --- a/src/views/Explanation/Explanation.js +++ b/src/views/Explanation/Explanation.js @@ -29,8 +29,8 @@ import {getTraceIdsFromLogs, parseLimeResult} from '../../util/dataReducers'; import JobModelsTable from '../../components/explanation/JobModelsTable'; import PredictionLineChartCard from '../../components/explanation/TemporalStability'; import {predictionListRequested} from '../../actions/PredictionAction'; -import ScatterChartCard from '../../components/chart/ScatterChartCard'; - +import limeTempStability from '../../mock_data/lime_temp_stability.json'; +import predictionTempStability from '../../mock_data/prediction_temp_stability.json'; class Explanation extends Component { constructor(props) { const selectedTrace = ''; @@ -144,9 +144,8 @@ class Explanation extends Component {
From da354e8d8ccb7927fa9d9d6617243da11a71336d Mon Sep 17 00:00:00 2001 From: Musacca <38190552+Musacca@users.noreply.github.com> Date: Wed, 22 Jan 2020 17:00:59 +0200 Subject: [PATCH 03/29] Temporal stability lime graph with mock data fix error --- src/components/chart/PredictionLineChart.js | 14 ++++++-------- src/util/dataReducers.js | 7 +++---- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/components/chart/PredictionLineChart.js b/src/components/chart/PredictionLineChart.js index 3d46db34..bf911f01 100644 --- a/src/components/chart/PredictionLineChart.js +++ b/src/components/chart/PredictionLineChart.js @@ -8,11 +8,6 @@ class PredictionLineChart extends React.Component { } render() { let graph = { - series: [ - {name: "prefix_1", - data: [-0.1376, 0.0487, 0.2555, 0.3617, -0.394, -0.2556] - } - ], options: { chart: { height: 350, @@ -22,12 +17,14 @@ class PredictionLineChart extends React.Component { show: false } }, + stroke: { + curve: 'smooth', + show: true, + width: 2 + }, dataLabels: { enabled: false, }, - stroke: { - curve: 'smooth' - }, title: { align: 'left' }, @@ -55,6 +52,7 @@ class PredictionLineChart extends React.Component { } } }, + legend: { position: 'top', horizontalAlign: 'right', diff --git a/src/util/dataReducers.js b/src/util/dataReducers.js index c6f43841..b9fadeca 100644 --- a/src/util/dataReducers.js +++ b/src/util/dataReducers.js @@ -290,18 +290,17 @@ export const parseTemporalStabilityLimeResultList = (predictionList, traceId) => if (predictionList[traceId] != null || predictionList[traceId] != undefined) { const traceAttr = predictionList[traceId]; prefixs = Object.keys(traceAttr); + data.pop(); for (let j = 0; j < prefixs.length; j++) { - let arr = []; const prefixValues = traceAttr[prefixs[j]]; for (let k = 1; k <= Object.keys(prefixValues).length; k++) { const value = prefixValues['prefix_'+k]; // console.log("Heer" +value); - arr.push(value['importance']); + if (j == 0) data.push({name: prefixs[k-1], data: []}); + data[k-1]['data'].push(value['importance']); // labels[j].push(value['value']); } - data.push({name: prefixs[j], data: arr}); } - data.shift(); } return ({data: data, categories: prefixs}); }; From 11548c9b790f3e0615a2d7755a118014d18151c2 Mon Sep 17 00:00:00 2001 From: Musacca <38190552+Musacca@users.noreply.github.com> Date: Wed, 22 Jan 2020 19:39:55 +0200 Subject: [PATCH 04/29] temporal stability APIs integrated --- src/actions/PredictionAction.js | 26 ++- src/actions/ServerActions.js | 23 ++- src/components/chart/PredictionLineChart.js | 14 +- src/components/chart/ScatterChartCard.js | 8 +- .../explanation/TemporalStability.js | 14 +- src/middlewares/ServerMiddleware.js | 9 +- src/mock_data/lime_temp_stability.json | 151 +----------------- src/reducers/Predictions.js | 65 ++++++-- src/util/dataReducers.js | 5 +- src/views/Explanation/Explanation.js | 49 ++++-- 10 files changed, 157 insertions(+), 207 deletions(-) diff --git a/src/actions/PredictionAction.js b/src/actions/PredictionAction.js index 7c1aff09..13b13be1 100644 --- a/src/actions/PredictionAction.js +++ b/src/actions/PredictionAction.js @@ -1,7 +1,21 @@ import {createPayloadForwardingAction} from './index'; -export const PREDICTION_LIST_REQUESTED = 'PREDICTION_LIST_REQUESTED'; -export const predictionListRequested = createPayloadForwardingAction(PREDICTION_LIST_REQUESTED); -export const PREDICTION_LIST_RETRIEVED = 'PREDICTION_LIST_RETRIEVED'; -export const predictionListRetrieved = createPayloadForwardingAction(PREDICTION_LIST_RETRIEVED); -export const PREDICTION_LIST_FAILED = 'PREDICTION_LIST_FAILED'; -export const predictionListFailed = createPayloadForwardingAction(PREDICTION_LIST_FAILED); +export const TEMPORAL_STABILITY_PREDICTION_LIST_REQUESTED = 'TEMPORAL_STABILITY_PREDICTION_LIST_REQUESTED'; +export const temporalPredictionListRequested = + createPayloadForwardingAction(TEMPORAL_STABILITY_PREDICTION_LIST_REQUESTED); +export const TEMPORAL_STABILITY_PREDICTION_LIST_RETRIEVED = 'TEMPORAL_STABILITY_PREDICTION_LIST_RETRIEVED'; +export const temporalPredictionListRetrieved = + createPayloadForwardingAction(TEMPORAL_STABILITY_PREDICTION_LIST_RETRIEVED); +export const TEMPORAL_STABILITY_PREDICTION_LIST_FAILED = 'TEMPORAL_STABILITY_PREDICTION_LIST_FAILED'; +export const temporalPredictionListFailed = + createPayloadForwardingAction(TEMPORAL_STABILITY_PREDICTION_LIST_FAILED); + + +export const TEMPORAL_STABILITY_LIME_PREDICTION_LIST_REQUESTED = 'LIME_PREDICTION_LIST_REQUESTED'; +export const temporalLimePredictionListRequested = + createPayloadForwardingAction(TEMPORAL_STABILITY_LIME_PREDICTION_LIST_REQUESTED); +export const TEMPORAL_STABILITY_LIME_PREDICTION_LIST_RETRIEVED = 'TEMPORAL_STABILITY_LIME_PREDICTION_LIST_RETRIEVED'; +export const temporalLimePredictionListRetrieved = + createPayloadForwardingAction(TEMPORAL_STABILITY_LIME_PREDICTION_LIST_RETRIEVED); +export const TEMPORAL_STABILITY_LIME_PREDICTION_LIST_FAILED = 'TEMPORAL_STABILITY_LIME_PREDICTION_LIST_FAILED'; +export const temporalLimePredictionListFailed = + createPayloadForwardingAction(TEMPORAL_STABILITY_LIME_PREDICTION_LIST_FAILED); diff --git a/src/actions/ServerActions.js b/src/actions/ServerActions.js index a5b3d5c6..c8ffc749 100644 --- a/src/actions/ServerActions.js +++ b/src/actions/ServerActions.js @@ -7,7 +7,8 @@ import {limeValueListFailed, limeValueListRetrieved} from './LimeActions'; import {splitFailed, splitsFailed, splitsRetrieved, splitSucceeded} from './SplitActions'; import {modelsFailed, modelsRetrieved} from './ModelActions'; import {predictionFailed, predictionSucceeded, replayFailed, replaySucceeded} from './RuntimeActions'; -import {predictionListRetrieved, predictionListFailed} from './PredictionAction'; +import {temporalLimePredictionListRetrieved, temporalLimePredictionListFailed, + temporalPredictionListRetrieved, temporalPredictionListFailed} from './PredictionAction'; export const getJobs = () => (dispatch) => { jsonAjax( @@ -140,14 +141,26 @@ export const getLimeValues = ({jobId, traceId}) => (dispatch) => { ); }; -export const getPredictionValues = ({jobId, traceId}) => (dispatch) => { +export const getLimeTemporalStabilityValues = ({jobId, traceId}) => (dispatch) => { jsonAjax( - `http://localhost:8083/api/test`, + SERVER_URL + `/explanation/lime_temporal_stability/${jobId}&${traceId}/`, 'GET', null, (predictionList) => { - dispatch(predictionListRetrieved(predictionList)); + dispatch(temporalLimePredictionListRetrieved(predictionList)); }, - ({error}) => dispatch(predictionListFailed(error)) + ({error}) => dispatch(temporalLimePredictionListFailed(error)) ); }; + +export const getPredictionTemporalStabilityValues = ({jobId, traceId}) => (dispatch) => { + jsonAjax( + SERVER_URL + `/explanation/temporal_stability/${jobId}&${traceId}/`, + 'GET', + null, + (predictionList) => { + dispatch(temporalPredictionListRetrieved(predictionList)); + }, + ({error}) => dispatch(temporalPredictionListFailed(error)) + ); +}; \ No newline at end of file diff --git a/src/components/chart/PredictionLineChart.js b/src/components/chart/PredictionLineChart.js index bf911f01..5e1f7768 100644 --- a/src/components/chart/PredictionLineChart.js +++ b/src/components/chart/PredictionLineChart.js @@ -29,7 +29,7 @@ class PredictionLineChart extends React.Component { align: 'left' }, markers: { - size: 1 + size: 5 }, xaxis: { min: 0, @@ -46,13 +46,18 @@ class PredictionLineChart extends React.Component { min: -1, max: 2, tickAmount: 3, + axisBorder: { + show: true, + color: '#000000', + offsetX: 0, + offsetY: 0 + }, labels: { formatter: function (val, i) { return val; } } }, - legend: { position: 'top', horizontalAlign: 'right', @@ -60,7 +65,7 @@ class PredictionLineChart extends React.Component { } }, }; - const height = 4 * 65; + const height = '350em'; const chart = ( ); - return
{this.props.data.length === 0 ? '' : chart}
; + return
{this.props.data.length === 0 || this.props.data[0].length === 0 + ? '' : chart}
; } } PredictionLineChart.propTypes = { diff --git a/src/components/chart/ScatterChartCard.js b/src/components/chart/ScatterChartCard.js index fddf5992..7d5c021a 100644 --- a/src/components/chart/ScatterChartCard.js +++ b/src/components/chart/ScatterChartCard.js @@ -46,16 +46,18 @@ const ScatterChartCard = props => { } }; - return ( - ); + />; + return
{props.data.length === 0 + ? '' : chart}
; }; + ScatterChartCard.propTypes = { data: PropTypes.arrayOf(PropTypes.any.isRequired).isRequired, }; diff --git a/src/components/explanation/TemporalStability.js b/src/components/explanation/TemporalStability.js index d9bdd264..c49f7945 100644 --- a/src/components/explanation/TemporalStability.js +++ b/src/components/explanation/TemporalStability.js @@ -6,11 +6,13 @@ import {parseTemporalStabilityLimeResultList, parseTemporalStabilityPredictionRe from '../../util/dataReducers'; import ScatterChartCard from '../chart/ScatterChartCard'; import {Row} from 'react-grid-system'; +import CircularProgress from 'react-md/lib/Progress/CircularProgress'; const TemporalStability = (props) => { - const temporalStabilityLimeResult = parseTemporalStabilityLimeResultList(props.limeTemporalChartData, '00000912'); + const temporalStabilityLimeResult = + parseTemporalStabilityLimeResultList(props.limeTemporalChartData, props.traceId); const temporalStabilityPredictionResult = - parseTemporalStabilityPredictionResultList(props.predictionTemportalChartData, '00000916'); + parseTemporalStabilityPredictionResultList(props.predictionTemportalChartData, props.traceId); return
@@ -20,6 +22,8 @@ const TemporalStability = (props) => { { props.traceId != '' && props.jobId != '' ? 'Temporal stability result with trace id: '+ props.traceId +' and job id: '+ props.jobId: ''} + {!props.isLimeTempStabilityLoaded ? : null} +
{ { props.traceId != '' && props.jobId != '' ? 'Temporal stability result with trace id: '+ props.traceId +' and job id: '+ props.jobId: ''} + {!props.isPredictionTempStabilityLoaded ? : null} +
{ switch (action.type) { - case PREDICTION_LIST_REQUESTED: { + case TEMPORAL_STABILITY_LIME_PREDICTION_LIST_REQUESTED: { + return { + ...state, + fetchState: {inFlight: true}, + isLimeTempStabilityLoaded: false, + + }; + } + + case TEMPORAL_STABILITY_LIME_PREDICTION_LIST_RETRIEVED: { + const limeTempStabilityList = action.payload; + return { + ...state, + fetchState: {inFlight: false}, + limeTempStabilityList, + isLimeTempStabilityLoaded: true + }; + } + + case TEMPORAL_STABILITY_LIME_PREDICTION_LIST_FAILED: { + const limeTempStabilityList = initialState.limeTempStabilityList; + return { + ...state, + fetchState: {inFlight: false, error: action.payload}, + limeTempStabilityList, + isLimeTempStabilityLoaded: true + }; + } + + case TEMPORAL_STABILITY_PREDICTION_LIST_REQUESTED: { return { ...state, fetchState: {inFlight: true}, - isPredictionsLoaded: false, + isPredictionTempStabilityLoaded: false, }; } - case PREDICTION_LIST_RETRIEVED: { - const predictionList = action.payload; + case TEMPORAL_STABILITY_PREDICTION_LIST_RETRIEVED: { + const predictionTempStabilityList = action.payload; return { ...state, fetchState: {inFlight: false}, - predictionList, - isPredictionsLoaded: true + predictionTempStabilityList, + isPredictionTempStabilityLoaded: true }; } - case PREDICTION_LIST_FAILED: { - const predictionList = initialState.predictionList; + case TEMPORAL_STABILITY_PREDICTION_LIST_FAILED: { + const predictionTempStabilityList = initialState.predictionTempStabilityList; return { ...state, fetchState: {inFlight: false, error: action.payload}, - predictionList, - isPredictionsLoaded: true + predictionTempStabilityList, + isPredictionTempStabilityLoaded: true }; } default: diff --git a/src/util/dataReducers.js b/src/util/dataReducers.js index b9fadeca..d3ff9f2c 100644 --- a/src/util/dataReducers.js +++ b/src/util/dataReducers.js @@ -285,7 +285,6 @@ export const parseLimeResult = (limeValueList) => { export const parseTemporalStabilityLimeResultList = (predictionList, traceId) => { let data = [[]]; - let labels = [[]]; let prefixs = []; if (predictionList[traceId] != null || predictionList[traceId] != undefined) { const traceAttr = predictionList[traceId]; @@ -295,10 +294,8 @@ export const parseTemporalStabilityLimeResultList = (predictionList, traceId) => const prefixValues = traceAttr[prefixs[j]]; for (let k = 1; k <= Object.keys(prefixValues).length; k++) { const value = prefixValues['prefix_'+k]; - // console.log("Heer" +value); - if (j == 0) data.push({name: prefixs[k-1], data: []}); + if (j == 0) data.push({name: 'prefix_'+k, data: []}); data[k-1]['data'].push(value['importance']); - // labels[j].push(value['value']); } } } diff --git a/src/views/Explanation/Explanation.js b/src/views/Explanation/Explanation.js index 9f9ae22d..d1527e28 100644 --- a/src/views/Explanation/Explanation.js +++ b/src/views/Explanation/Explanation.js @@ -28,9 +28,9 @@ import TraceExplanation from '../../components/explanation/TraceExplanation'; import {getTraceIdsFromLogs, parseLimeResult} from '../../util/dataReducers'; import JobModelsTable from '../../components/explanation/JobModelsTable'; import PredictionLineChartCard from '../../components/explanation/TemporalStability'; -import {predictionListRequested} from '../../actions/PredictionAction'; -import limeTempStability from '../../mock_data/lime_temp_stability.json'; -import predictionTempStability from '../../mock_data/prediction_temp_stability.json'; +import {temporalPredictionListRequested, temporalLimePredictionListRequested} from '../../actions/PredictionAction'; +// import limeTempStability from '../../mock_data/lime_temp_stability.json'; +// import predictionTempStability from '../../mock_data/prediction_temp_stability.json'; class Explanation extends Component { constructor(props) { const selectedTrace = ''; @@ -60,7 +60,7 @@ class Explanation extends Component { let split = splits[key]; if (split.id == splitId) { - logId = split.training_log; + logId = split.test_log; } }); @@ -70,22 +70,23 @@ class Explanation extends Component { onChangeTrace(trace) { this.props.onTraceChange(trace); this.setState({selectedTrace: trace}); - this.props.onRequestPredictionList(1, 1); if (this.props.jobId.length != 0) { - this.props.onRequestLimeValues(this.props.jobId, trace); + // this.props.onRequestLimeValues(this.props.jobId, trace); + this.props.onRequestLimeTemporalList(this.props.jobId, trace); + this.props.onRequestPredictionTemporalList(this.props.jobId, trace); } } onChangeJob(id) { this.props.onJobChange(id); if (this.props.selectedTrace !== '') { - this.props.onRequestLimeValues(id, this.props.selectedTrace); - this.props.onRequestPredictionList(id, this.props.selectedTrace); + // this.props.onRequestLimeValues(id, this.props.selectedTrace); + this.props.onRequestLimeTemporalList(id, this.props.selectedTrace); + this.props.onRequestPredictionTemporalList(id, this.props.selectedTrace); } } componentDidMount() { - this.props.onRequestPredictionList(1, 1); if (this.props.jobs.length === 0) { this.props.onRequestLogList(); this.props.onRequestSplitList(); @@ -104,6 +105,8 @@ class Explanation extends Component { } render() { + console.log(this.props.predictionTempStabilityList) + console.log(this.props.limeTempStabilityList) return (
@@ -137,16 +140,18 @@ class Explanation extends Component { />
-
-
@@ -167,7 +172,8 @@ Explanation.propTypes = { onRequestTraces: PropTypes.func.isRequired, onJobChange: PropTypes.func.isRequired, onRequestLimeValues: PropTypes.func.isRequired, - onRequestPredictionList: PropTypes.func.isRequired, + onRequestPredictionTemporalList: PropTypes.func.isRequired, + onRequestLimeTemporalList: PropTypes.func.isRequired, filterOptionChange: PropTypes.func.isRequired, labelTypeChange: PropTypes.func.isRequired, jobs: PropTypes.arrayOf(jobPropType).isRequired, @@ -195,8 +201,11 @@ Explanation.propTypes = { selectedTrace: PropTypes.any, filteredJobs: PropTypes.any, jobId: PropTypes.number.isRequired, + isLimeTempStabilityLoaded: PropTypes.bool.isRequired, + isPredictionTempStabilityLoaded: PropTypes.bool.isRequired, isLimeValuesLoaded: PropTypes.bool.isRequired, - predictionList: PropTypes.any + limeTempStabilityList: PropTypes.any, + predictionTempStabilityList: PropTypes.any }; const mapStateToProps = (state) => ({ @@ -216,7 +225,10 @@ const mapStateToProps = (state) => ({ jobsById: state.jobs.byId, jobId: state.jobs.predictionJobId, selectedTrace: state.jobs.selectedTrace, - predictionList: state.predictions.predictionList, + limeTempStabilityList: state.predictions.limeTempStabilityList, + predictionTempStabilityList: state.predictions.predictionTempStabilityList, + isLimeTempStabilityLoaded: state.predictions.isLimeTempStabilityLoaded, + isPredictionTempStabilityLoaded: state.predictions.isPredictionTempStabilityLoaded, filterOptions: ( ({ encodings, clusterings, classification, regression, timeSeriesPrediction, @@ -239,7 +251,10 @@ const mapDispatchToProps = (dispatch) => ({ onRequestJobs: () => dispatch(jobsRequested()), onRequestTraces: (id) => dispatch(traceListRequested({id})), onRequestLimeValues: (jobId, traceId) => dispatch(limeValueListRequested({jobId, traceId})), - onRequestPredictionList: (jobId, traceId) => dispatch(predictionListRequested({jobId, traceId})), + onRequestPredictionTemporalList: (jobId, traceId) => + dispatch(temporalPredictionListRequested({jobId, traceId})), + onRequestLimeTemporalList: (jobId, traceId) => + dispatch(temporalLimePredictionListRequested({jobId, traceId})), filterOptionChange: (_, event) => dispatch({ type: FILTER_OPTION_CHANGED, payload: {name: event.target.name, value: event.target.value} From 1f126e9f95c599521bd6981cc17d677efd3514da Mon Sep 17 00:00:00 2001 From: Musacca <38190552+Musacca@users.noreply.github.com> Date: Wed, 22 Jan 2020 20:37:41 +0200 Subject: [PATCH 05/29] clean code --- .../chart/PredictionLineChart.test.js | 7 +- .../PredictionLineChartCard.test.js | 12 - src/actions/ServerActions.js | 4 +- src/mock_data/lime_temp_stability.json | 18 - src/mock_data/prediction_temp_stability.json | 5630 ----------------- src/views/Explanation/Explanation.js | 10 +- 6 files changed, 7 insertions(+), 5674 deletions(-) delete mode 100644 src/__tests__/components/explanation/PredictionLineChartCard.test.js delete mode 100644 src/mock_data/lime_temp_stability.json delete mode 100644 src/mock_data/prediction_temp_stability.json diff --git a/src/__tests__/components/chart/PredictionLineChart.test.js b/src/__tests__/components/chart/PredictionLineChart.test.js index 39a9bd31..d8f0410c 100644 --- a/src/__tests__/components/chart/PredictionLineChart.test.js +++ b/src/__tests__/components/chart/PredictionLineChart.test.js @@ -4,7 +4,7 @@ import ReactApexChart from 'react-apexcharts'; import PredictionLineChart from '../../../components/chart/PredictionLineChart'; const categories = ['event', 'event1', 'event2', 'event3', 'event4']; -const values = [1, 0.8, 0.1, 0.3, 0]; +const values = [[16.4, 5.4], [21.7, 2], [25.4, 3], [19, 2], [10.9, 1]]; describe('PredictionLineChart', () => { it('renders with empty data', () => { @@ -18,8 +18,6 @@ describe('PredictionLineChart', () => { expect(element).toBeDefined(); expect(element.find(ReactApexChart).length).toBe(1); - const chartProps = element.find(ReactApexChart).props(); - expect(chartProps.options.xaxis.categories.length).toBe(0); }); it('renders with non empty data and label', () => { @@ -28,7 +26,6 @@ describe('PredictionLineChart', () => { expect(element.find(ReactApexChart).length).toBe(1); const chartProps = element.find(ReactApexChart).props(); - expect(chartProps.options.xaxis.categories.length).toBe(5); - expect(chartProps.series[0].data.length).toBe(5); + expect(chartProps.series.length).toBe(5); }); }); diff --git a/src/__tests__/components/explanation/PredictionLineChartCard.test.js b/src/__tests__/components/explanation/PredictionLineChartCard.test.js deleted file mode 100644 index 7598017e..00000000 --- a/src/__tests__/components/explanation/PredictionLineChartCard.test.js +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react'; -import {shallow} from 'enzyme'; -import PredictionLineChartCard from '../../../components/explanation/PredictionLineChartCard'; -import PredictionLineChart from '../../../components/chart/PredictionLineChart'; - -const data = {'11': 0.23601741983630742, '12': 0.6921891807047289, '13': 0.9996623681734312, '14': 0.7841328330041475}; -const element = shallow(); -it('renders', () => { - expect(element).toBeDefined(); - expect(element.find(PredictionLineChart).length).toBe(1); -}); - diff --git a/src/actions/ServerActions.js b/src/actions/ServerActions.js index c8ffc749..b4d11f4a 100644 --- a/src/actions/ServerActions.js +++ b/src/actions/ServerActions.js @@ -7,7 +7,7 @@ import {limeValueListFailed, limeValueListRetrieved} from './LimeActions'; import {splitFailed, splitsFailed, splitsRetrieved, splitSucceeded} from './SplitActions'; import {modelsFailed, modelsRetrieved} from './ModelActions'; import {predictionFailed, predictionSucceeded, replayFailed, replaySucceeded} from './RuntimeActions'; -import {temporalLimePredictionListRetrieved, temporalLimePredictionListFailed, +import {temporalLimePredictionListRetrieved, temporalLimePredictionListFailed, temporalPredictionListRetrieved, temporalPredictionListFailed} from './PredictionAction'; export const getJobs = () => (dispatch) => { @@ -163,4 +163,4 @@ export const getPredictionTemporalStabilityValues = ({jobId, traceId}) => (dispa }, ({error}) => dispatch(temporalPredictionListFailed(error)) ); -}; \ No newline at end of file +}; diff --git a/src/mock_data/lime_temp_stability.json b/src/mock_data/lime_temp_stability.json deleted file mode 100644 index 5a9a6760..00000000 --- a/src/mock_data/lime_temp_stability.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "00000912": { - "prefix_1": { - "prefix_3": { - "value": "assumption laboratory", - "importance": 0.1981 - }, - "prefix_2": { - "value": "assumption laboratory", - "importance": 0.1144 - }, - "prefix_1": { - "value": "assumption laboratory", - "importance": 0.0194 - } - } - } -} \ No newline at end of file diff --git a/src/mock_data/prediction_temp_stability.json b/src/mock_data/prediction_temp_stability.json deleted file mode 100644 index 618f2410..00000000 --- a/src/mock_data/prediction_temp_stability.json +++ /dev/null @@ -1,5630 +0,0 @@ -{ - "00000924": { - "prefix_1": { - "value": "cytology - vagina -", - "predicted": "true" - }, - "prefix_2": { - "value": "outpatient follow-up consultation", - "predicted": "false" - }, - "prefix_3": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_4": { - "value": "telephone consultation", - "predicted": "false" - } - }, - "00001089": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000916": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "unconjugated bilirubin", - "predicted": "true" - } - }, - "00000971": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "compartment for inspection", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "unconjugated bilirubin", - "predicted": "true" - } - }, - "00001011": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_4": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_5": { - "value": "glucose", - "predicted": "false" - }, - "prefix_6": { - "value": "urea", - "predicted": "true" - } - }, - "00000946": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001004": { - "prefix_1": { - "value": "ultrasound - internal genitals", - "predicted": "true" - }, - "prefix_2": { - "value": "immuno-pathology", - "predicted": "true" - }, - "prefix_3": { - "value": "histological examination - biopsies nno", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "hemoglobin photoelectric", - "predicted": "true" - } - }, - "00001035": { - "prefix_1": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "true" - }, - "prefix_2": { - "value": "histological examination - biopsies nno", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "unconjugated bilirubin", - "predicted": "true" - } - }, - "00001038": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "0", - "predicted": "false" - }, - "prefix_3": { - "value": "0", - "predicted": "false" - }, - "prefix_4": { - "value": "0", - "predicted": "false" - }, - "prefix_5": { - "value": "order rate", - "predicted": "true" - }, - "prefix_6": { - "value": "0", - "predicted": "true" - } - }, - "00000940": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000954": { - "prefix_1": { - "value": "thorax", - "predicted": "true" - }, - "prefix_2": { - "value": "First outpatient consultation", - "predicted": "true" - }, - "prefix_3": { - "value": "0", - "predicted": "true" - }, - "prefix_4": { - "value": "0", - "predicted": "true" - }, - "prefix_5": { - "value": "0", - "predicted": "true" - }, - "prefix_6": { - "value": "0", - "predicted": "true" - } - }, - "00000939": { - "prefix_1": { - "value": "telephone consultation", - "predicted": "true" - }, - "prefix_2": { - "value": "outpatient follow-up consultation", - "predicted": "true" - }, - "prefix_3": { - "value": "administrative fee - the first pol", - "predicted": "false" - } - }, - "00000970": { - "prefix_1": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "true" - }, - "prefix_2": { - "value": "histological examination - biopsies nno", - "predicted": "false" - }, - "prefix_3": { - "value": "cito histological examination", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "unconjugated bilirubin", - "predicted": "true" - } - }, - "00001054": { - "prefix_1": { - "value": "ultrasound - internal genitals", - "predicted": "true" - }, - "prefix_2": { - "value": "cytology - ectocervix -", - "predicted": "true" - }, - "prefix_3": { - "value": "First outpatient consultation", - "predicted": "true" - }, - "prefix_4": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_5": { - "value": "immuno-pathology", - "predicted": "true" - }, - "prefix_6": { - "value": "0", - "predicted": "true" - } - }, - "00001123": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_3": { - "value": "compartment for inspection", - "predicted": "false" - }, - "prefix_4": { - "value": "0", - "predicted": "false" - }, - "prefix_5": { - "value": "0", - "predicted": "false" - } - }, - "00001000": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_3": { - "value": "telephone consultation", - "predicted": "false" - }, - "prefix_4": { - "value": "outpatient follow-up consultation", - "predicted": "false" - } - }, - "00001128": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "compartment for inspection", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "unconjugated bilirubin", - "predicted": "true" - } - }, - "00001138": { - "prefix_1": { - "value": "ultrasound - internal genitals", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000922": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "hemoglobin photoelectric", - "predicted": "false" - }, - "prefix_4": { - "value": "ABO blood group and rhesus factor", - "predicted": "false" - }, - "prefix_5": { - "value": "rhesus factor d - Centrifuge method - email", - "predicted": "true" - }, - "prefix_6": { - "value": "0", - "predicted": "true" - } - }, - "00001072": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001076": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001039": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000995": { - "prefix_1": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001126": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_4": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_5": { - "value": "glucose", - "predicted": "false" - }, - "prefix_6": { - "value": "urea", - "predicted": "true" - } - }, - "00001101": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "outpatient follow-up consultation", - "predicted": "false" - }, - "prefix_3": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_4": { - "value": "administrative fee - the first pol", - "predicted": "false" - } - }, - "00000936": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "compartment for inspection", - "predicted": "true" - }, - "prefix_3": { - "value": "cytology - ectocervix -", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "assumption laboratory", - "predicted": "false" - } - }, - "00000976": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_3": { - "value": "compartment for inspection", - "predicted": "false" - }, - "prefix_4": { - "value": "e.c.g. - Electrocardiography", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "assumption laboratory", - "predicted": "false" - } - }, - "00000950": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001018": { - "prefix_1": { - "value": "cytology - vagina -", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001069": { - "prefix_1": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "urea", - "predicted": "true" - } - }, - "00001142": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001083": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001098": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001115": { - "prefix_1": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "true" - }, - "prefix_2": { - "value": "0", - "predicted": "true" - }, - "prefix_3": { - "value": "0", - "predicted": "true" - }, - "prefix_4": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "false" - }, - "prefix_5": { - "value": "histological examination - biopsies nno", - "predicted": "true" - }, - "prefix_6": { - "value": "cito histological examination", - "predicted": "true" - } - }, - "00000985": { - "prefix_1": { - "value": "ultrasound - internal genitals", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000914": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001033": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001102": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000988": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001081": { - "prefix_1": { - "value": "outpatient follow-up consultation", - "predicted": "true" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "true" - }, - "prefix_3": { - "value": "thorax", - "predicted": "false" - }, - "prefix_4": { - "value": "0", - "predicted": "false" - }, - "prefix_5": { - "value": "telephone consultation", - "predicted": "true" - }, - "prefix_6": { - "value": "assumption laboratory", - "predicted": "true" - } - }, - "00001111": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001002": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_3": { - "value": "compartment for inspection", - "predicted": "false" - }, - "prefix_4": { - "value": "telephone consultation", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "assumption laboratory", - "predicted": "false" - } - }, - "00000961": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001051": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_3": { - "value": "administrative fee - the first pol", - "predicted": "false" - } - }, - "00001124": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "unconjugated bilirubin", - "predicted": "true" - } - }, - "00000945": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_3": { - "value": "0", - "predicted": "false" - }, - "prefix_4": { - "value": "0", - "predicted": "false" - }, - "prefix_5": { - "value": "0", - "predicted": "false" - }, - "prefix_6": { - "value": "First outpatient consultation", - "predicted": "true" - } - }, - "00000956": { - "prefix_1": { - "value": "ultrasound - internal genitals", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000955": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001010": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001014": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000949": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "unconjugated bilirubin", - "predicted": "true" - } - }, - "00001052": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000920": { - "prefix_1": { - "value": "0", - "predicted": "false" - } - }, - "00001103": { - "prefix_1": { - "value": "outpatient follow-up consultation", - "predicted": "true" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "true" - }, - "prefix_3": { - "value": "telephone consultation", - "predicted": "false" - } - }, - "00001104": { - "prefix_1": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001136": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000984": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_4": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_5": { - "value": "glucose", - "predicted": "false" - }, - "prefix_6": { - "value": "urea", - "predicted": "true" - } - }, - "00001129": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "0", - "predicted": "false" - }, - "prefix_4": { - "value": "0", - "predicted": "false" - }, - "prefix_5": { - "value": "order rate", - "predicted": "true" - }, - "prefix_6": { - "value": "First outpatient consultation", - "predicted": "true" - } - }, - "00000977": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001012": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_3": { - "value": "compartment for inspection", - "predicted": "false" - }, - "prefix_4": { - "value": "telephone consultation", - "predicted": "false" - }, - "prefix_5": { - "value": "telephone consultation", - "predicted": "false" - } - }, - "00000944": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "outpatient follow-up consultation", - "predicted": "false" - }, - "prefix_3": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_4": { - "value": "telephone consultation", - "predicted": "false" - }, - "prefix_5": { - "value": "telephone consultation", - "predicted": "false" - } - }, - "00001057": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001114": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "0", - "predicted": "false" - }, - "prefix_5": { - "value": "urea", - "predicted": "true" - }, - "prefix_6": { - "value": "hemoglobin photoelectric", - "predicted": "true" - } - }, - "00000947": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_3": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_4": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_5": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "true" - }, - "prefix_6": { - "value": "190021 clinical admission A002", - "predicted": "true" - } - }, - "00000990": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000962": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001090": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001008": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "0", - "predicted": "false" - }, - "prefix_3": { - "value": "0", - "predicted": "false" - }, - "prefix_4": { - "value": "0", - "predicted": "false" - }, - "prefix_5": { - "value": "order rate", - "predicted": "true" - }, - "prefix_6": { - "value": "0", - "predicted": "true" - } - }, - "00001131": { - "prefix_1": { - "value": "ultrasound - internal genitals", - "predicted": "true" - }, - "prefix_2": { - "value": "thorax", - "predicted": "true" - }, - "prefix_3": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_4": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_5": { - "value": "thorax", - "predicted": "true" - }, - "prefix_6": { - "value": "ct abdomen", - "predicted": "true" - } - }, - "00000959": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000926": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000996": { - "prefix_1": { - "value": "ultrasound - internal genitals", - "predicted": "true" - }, - "prefix_2": { - "value": "cytology - ectocervix -", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "0", - "predicted": "false" - }, - "prefix_6": { - "value": "bacteriological examination of breeding nie", - "predicted": "false" - } - }, - "00001141": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001060": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001080": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001044": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_3": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_4": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_5": { - "value": "thorax", - "predicted": "true" - }, - "prefix_6": { - "value": "First outpatient consultation", - "predicted": "true" - } - }, - "00001059": { - "prefix_1": { - "value": "ultrasound - internal genitals", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001074": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001026": { - "prefix_1": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "assumption laboratory", - "predicted": "false" - } - }, - "00001109": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - } - }, - "00001053": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "cytology - ectocervix -", - "predicted": "false" - }, - "prefix_3": { - "value": "histological examination - biopsies nno", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "assumption laboratory", - "predicted": "false" - } - }, - "00000951": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "ultrasound - internal genitals", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "unconjugated bilirubin", - "predicted": "true" - } - }, - "00000933": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001029": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001112": { - "prefix_1": { - "value": "histological examination - biopsies nno", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000969": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "compartment for inspection", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "unconjugated bilirubin", - "predicted": "true" - } - }, - "00000921": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000928": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001041": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001047": { - "prefix_1": { - "value": "thorax", - "predicted": "true" - }, - "prefix_2": { - "value": "First outpatient consultation", - "predicted": "true" - }, - "prefix_3": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_4": { - "value": "ct abdomen", - "predicted": "false" - }, - "prefix_5": { - "value": "compartment for inspection", - "predicted": "false" - } - }, - "00001139": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001067": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "ca-125 using meia", - "predicted": "false" - }, - "prefix_3": { - "value": "order rate", - "predicted": "false" - }, - "prefix_4": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_5": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_6": { - "value": "telephone consultation", - "predicted": "true" - } - }, - "00000930": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000934": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000963": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_4": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_5": { - "value": "glucose", - "predicted": "false" - }, - "prefix_6": { - "value": "urea", - "predicted": "true" - } - }, - "00001019": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001025": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001042": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001058": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001130": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001132": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001050": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001119": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001046": { - "prefix_1": { - "value": "cytology - vagina -", - "predicted": "true" - }, - "prefix_2": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_3": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_4": { - "value": "telephone consultation", - "predicted": "false" - } - }, - "00001110": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "0", - "predicted": "false" - }, - "prefix_3": { - "value": "histological examination - biopsies nno", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "assumption laboratory", - "predicted": "false" - } - }, - "00001037": { - "prefix_1": { - "value": "cytology - ectocervix -", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000968": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_3": { - "value": "chest ct", - "predicted": "false" - }, - "prefix_4": { - "value": "telephone consultation", - "predicted": "false" - } - }, - "00001096": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000941": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001122": { - "prefix_1": { - "value": "ultrasound - internal genitals", - "predicted": "true" - }, - "prefix_2": { - "value": "histological examination - biopsies nno", - "predicted": "true" - }, - "prefix_3": { - "value": "histological examination - biopsies nno", - "predicted": "false" - }, - "prefix_4": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_5": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_6": { - "value": "0", - "predicted": "false" - } - }, - "00001107": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_3": { - "value": "compartment for inspection", - "predicted": "false" - } - }, - "00000932": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001108": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000979": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_5": { - "value": "hemoglobin photoelectric", - "predicted": "true" - }, - "prefix_6": { - "value": "creatinine", - "predicted": "true" - } - }, - "00001001": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "0", - "predicted": "false" - } - }, - "00000964": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001036": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001117": { - "prefix_1": { - "value": "ultrasound - internal genitals", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001020": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001133": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - } - }, - "00000991": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000986": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001003": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_3": { - "value": "telephone consultation", - "predicted": "false" - }, - "prefix_4": { - "value": "outpatient follow-up consultation", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "assumption laboratory", - "predicted": "false" - } - }, - "00001140": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001031": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001106": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000915": { - "prefix_1": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000942": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "compartment for inspection", - "predicted": "false" - }, - "prefix_3": { - "value": "histological examination - biopsies nno", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "assumption laboratory", - "predicted": "false" - } - }, - "00001078": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001137": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001009": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001013": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_3": { - "value": "compartment for inspection", - "predicted": "false" - }, - "prefix_4": { - "value": "outpatient follow-up consultation", - "predicted": "false" - }, - "prefix_5": { - "value": "outpatient follow-up consultation", - "predicted": "false" - }, - "prefix_6": { - "value": "simulator - use before megavol", - "predicted": "true" - } - }, - "00001023": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_4": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_5": { - "value": "glucose", - "predicted": "false" - }, - "prefix_6": { - "value": "urea", - "predicted": "true" - } - }, - "00001048": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000925": { - "prefix_1": { - "value": "cytology - ectocervix -", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001116": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "compartment for inspection", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "unconjugated bilirubin", - "predicted": "true" - } - }, - "00000952": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_3": { - "value": "compartment for inspection", - "predicted": "false" - }, - "prefix_4": { - "value": "cito histological examination", - "predicted": "false" - }, - "prefix_5": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_6": { - "value": "administrative fee - the first pol", - "predicted": "false" - } - }, - "00001093": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000997": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - } - }, - "00001085": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "histological examination - biopsies nno", - "predicted": "false" - }, - "prefix_3": { - "value": "cito histological examination", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "assumption laboratory", - "predicted": "false" - } - }, - "00000923": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000938": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001045": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001055": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_4": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_5": { - "value": "glucose", - "predicted": "false" - }, - "prefix_6": { - "value": "urea", - "predicted": "true" - } - }, - "00000966": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000931": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - } - }, - "00001049": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001100": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000958": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "cytology - ectocervix -", - "predicted": "false" - }, - "prefix_3": { - "value": "histological examination - biopsies nno", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "assumption laboratory", - "predicted": "false" - } - }, - "00001087": { - "prefix_1": { - "value": "outpatient follow-up consultation", - "predicted": "true" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "true" - }, - "prefix_3": { - "value": "0", - "predicted": "true" - }, - "prefix_4": { - "value": "telephone consultation", - "predicted": "false" - } - }, - "00001088": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_4": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_5": { - "value": "glucose", - "predicted": "false" - }, - "prefix_6": { - "value": "urea", - "predicted": "true" - } - }, - "00001120": { - "prefix_1": { - "value": "ultrasound - internal genitals", - "predicted": "true" - }, - "prefix_2": { - "value": "cytology - vagina -", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "urea", - "predicted": "true" - }, - "prefix_6": { - "value": "hemoglobin photoelectric", - "predicted": "true" - } - }, - "00001021": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000974": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_3": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_4": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_5": { - "value": "0", - "predicted": "false" - }, - "prefix_6": { - "value": "ct abdomen", - "predicted": "false" - } - }, - "00001079": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001005": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001062": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000929": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000978": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000975": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000980": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_4": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_5": { - "value": "glucose", - "predicted": "false" - }, - "prefix_6": { - "value": "urea", - "predicted": "true" - } - }, - "00001024": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000927": { - "prefix_1": { - "value": "outpatient follow-up consultation", - "predicted": "true" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "true" - } - }, - "00000953": { - "prefix_1": { - "value": "outpatient follow-up consultation", - "predicted": "true" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "true" - }, - "prefix_3": { - "value": "0", - "predicted": "true" - }, - "prefix_4": { - "value": "telephone consultation", - "predicted": "false" - }, - "prefix_5": { - "value": "outpatient follow-up consultation", - "predicted": "false" - } - }, - "00000918": { - "prefix_1": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "true" - }, - "prefix_2": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "false" - }, - "prefix_3": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "assumption laboratory", - "predicted": "false" - } - }, - "00001022": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001134": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "ca-125 using meia", - "predicted": "false" - }, - "prefix_3": { - "value": "order rate", - "predicted": "false" - }, - "prefix_4": { - "value": "outpatient follow-up consultation", - "predicted": "false" - }, - "prefix_5": { - "value": "telephone consultation", - "predicted": "false" - } - }, - "00001040": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000989": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_4": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_5": { - "value": "glucose", - "predicted": "false" - }, - "prefix_6": { - "value": "urea", - "predicted": "true" - } - }, - "00001075": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - } - }, - "00001077": { - "prefix_1": { - "value": "histological examination - biopsies nno", - "predicted": "true" - }, - "prefix_2": { - "value": "0", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "unconjugated bilirubin", - "predicted": "true" - } - }, - "00001092": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000948": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000917": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001015": { - "prefix_1": { - "value": "histological examination - biopsies nno", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001091": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_4": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_5": { - "value": "glucose", - "predicted": "false" - }, - "prefix_6": { - "value": "urea", - "predicted": "true" - } - }, - "00000935": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001030": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001105": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001095": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "glucose", - "predicted": "true" - }, - "prefix_6": { - "value": "urea", - "predicted": "true" - } - }, - "00001016": { - "prefix_1": { - "value": "outpatient follow-up consultation", - "predicted": "true" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "true" - } - }, - "00001113": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "unconjugated bilirubin", - "predicted": "true" - } - }, - "00001084": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001032": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "cytology - ectocervix -", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "unconjugated bilirubin", - "predicted": "true" - } - }, - "00000919": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001034": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000960": { - "prefix_1": { - "value": "ultrasound - internal genitals", - "predicted": "true" - }, - "prefix_2": { - "value": "First outpatient consultation", - "predicted": "true" - }, - "prefix_3": { - "value": "administrative fee - the first pol", - "predicted": "true" - }, - "prefix_4": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "false" - }, - "prefix_5": { - "value": "190205 Class 3b A205", - "predicted": "false" - }, - "prefix_6": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "false" - } - }, - "00001066": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_4": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_5": { - "value": "glucose", - "predicted": "false" - }, - "prefix_6": { - "value": "urea", - "predicted": "true" - } - }, - "00001086": { - "prefix_1": { - "value": "telephone consultation", - "predicted": "true" - }, - "prefix_2": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "urea", - "predicted": "true" - } - }, - "00000973": { - "prefix_1": { - "value": "histological examination - biopsies nno", - "predicted": "true" - }, - "prefix_2": { - "value": "First outpatient consultation", - "predicted": "true" - }, - "prefix_3": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_4": { - "value": "e.c.g. - Electrocardiography", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "0", - "predicted": "false" - } - }, - "00001097": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001099": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000912": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000937": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001064": { - "prefix_1": { - "value": "ultrasound - internal genitals", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001065": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - } - }, - "00001027": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000999": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "compartment for inspection", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "unconjugated bilirubin", - "predicted": "true" - } - }, - "00001056": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "squamous cell carcinoma using eia", - "predicted": "false" - }, - "prefix_3": { - "value": "order rate", - "predicted": "false" - }, - "prefix_4": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_5": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_6": { - "value": "MRI abdomen", - "predicted": "false" - } - }, - "00001070": { - "prefix_1": { - "value": "0", - "predicted": "false" - }, - "prefix_2": { - "value": "cytology - ectocervix -", - "predicted": "false" - }, - "prefix_3": { - "value": "histological examination - biopsies nno", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "assumption laboratory", - "predicted": "false" - } - }, - "00001073": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000981": { - "prefix_1": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "true" - }, - "prefix_2": { - "value": "0", - "predicted": "true" - }, - "prefix_3": { - "value": "0", - "predicted": "true" - }, - "prefix_4": { - "value": "0", - "predicted": "true" - }, - "prefix_5": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "true" - }, - "prefix_6": { - "value": "assumption laboratory", - "predicted": "true" - } - }, - "00001082": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_3": { - "value": "outpatient follow-up consultation", - "predicted": "false" - } - }, - "00000965": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_4": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_5": { - "value": "glucose", - "predicted": "false" - }, - "prefix_6": { - "value": "urea", - "predicted": "true" - } - }, - "00001094": { - "prefix_1": { - "value": "cytology - ectocervix -", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001028": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000972": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001043": { - "prefix_1": { - "value": "ultrasound - internal genitals", - "predicted": "true" - }, - "prefix_2": { - "value": "First outpatient consultation", - "predicted": "true" - }, - "prefix_3": { - "value": "administrative fee - the first pol", - "predicted": "true" - }, - "prefix_4": { - "value": "telephone consultation", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "CEA - tumor marker using meia", - "predicted": "false" - } - }, - "00001061": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001071": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001125": { - "prefix_1": { - "value": "histological examination - biopsies nno", - "predicted": "true" - }, - "prefix_2": { - "value": "0", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "unconjugated bilirubin", - "predicted": "true" - } - }, - "00001017": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00000982": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000957": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001121": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001006": { - "prefix_1": { - "value": "e.c.g. - Electrocardiography", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001135": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00000967": { - "prefix_1": { - "value": "histological examination - biopsies nno", - "predicted": "true" - }, - "prefix_2": { - "value": "First outpatient consultation", - "predicted": "true" - }, - "prefix_3": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "0", - "predicted": "false" - }, - "prefix_6": { - "value": "0", - "predicted": "false" - } - }, - "00000983": { - "prefix_1": { - "value": "thorax", - "predicted": "true" - }, - "prefix_2": { - "value": "First outpatient consultation", - "predicted": "true" - }, - "prefix_3": { - "value": "administrative fee - the first pol", - "predicted": "false" - }, - "prefix_4": { - "value": "ct abdomen", - "predicted": "false" - }, - "prefix_5": { - "value": "outpatient follow-up consultation", - "predicted": "true" - } - }, - "00000998": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001063": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001118": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001007": { - "prefix_1": { - "value": "ultrasound - internal genitals", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "hemoglobin photoelectric", - "predicted": "false" - }, - "prefix_5": { - "value": "creatinine", - "predicted": "false" - }, - "prefix_6": { - "value": "0", - "predicted": "false" - } - }, - "00000943": { - "prefix_1": { - "value": "ultrasound - internal genitals", - "predicted": "true" - }, - "prefix_2": { - "value": "histological examination - biopsies nno", - "predicted": "true" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_6": { - "value": "unconjugated bilirubin", - "predicted": "true" - } - }, - "00000987": { - "prefix_1": { - "value": "demurrage - all spec.beh.kinderg.-Reval.", - "predicted": "true" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_5": { - "value": "unconjugated bilirubin", - "predicted": "true" - }, - "prefix_6": { - "value": "bilirubin - total", - "predicted": "true" - } - }, - "00001068": { - "prefix_1": { - "value": "First outpatient consultation", - "predicted": "false" - }, - "prefix_2": { - "value": "administrative fee - the first pol", - "predicted": "false" - } - }, - "00000913": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - }, - "00001127": { - "prefix_1": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_2": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_3": { - "value": "assumption laboratory", - "predicted": "false" - }, - "prefix_4": { - "value": "unconjugated bilirubin", - "predicted": "false" - }, - "prefix_5": { - "value": "bilirubin - total", - "predicted": "false" - }, - "prefix_6": { - "value": "glucose", - "predicted": "false" - } - } -} diff --git a/src/views/Explanation/Explanation.js b/src/views/Explanation/Explanation.js index d1527e28..88319fb7 100644 --- a/src/views/Explanation/Explanation.js +++ b/src/views/Explanation/Explanation.js @@ -29,8 +29,6 @@ import {getTraceIdsFromLogs, parseLimeResult} from '../../util/dataReducers'; import JobModelsTable from '../../components/explanation/JobModelsTable'; import PredictionLineChartCard from '../../components/explanation/TemporalStability'; import {temporalPredictionListRequested, temporalLimePredictionListRequested} from '../../actions/PredictionAction'; -// import limeTempStability from '../../mock_data/lime_temp_stability.json'; -// import predictionTempStability from '../../mock_data/prediction_temp_stability.json'; class Explanation extends Component { constructor(props) { const selectedTrace = ''; @@ -71,16 +69,16 @@ class Explanation extends Component { this.props.onTraceChange(trace); this.setState({selectedTrace: trace}); if (this.props.jobId.length != 0) { - // this.props.onRequestLimeValues(this.props.jobId, trace); + this.props.onRequestLimeValues(this.props.jobId, trace); this.props.onRequestLimeTemporalList(this.props.jobId, trace); - this.props.onRequestPredictionTemporalList(this.props.jobId, trace); + this.props.onRequestPredictionTemporalList(this.props.jobId, trace); } } onChangeJob(id) { this.props.onJobChange(id); if (this.props.selectedTrace !== '') { - // this.props.onRequestLimeValues(id, this.props.selectedTrace); + this.props.onRequestLimeValues(id, this.props.selectedTrace); this.props.onRequestLimeTemporalList(id, this.props.selectedTrace); this.props.onRequestPredictionTemporalList(id, this.props.selectedTrace); } @@ -105,8 +103,6 @@ class Explanation extends Component { } render() { - console.log(this.props.predictionTempStabilityList) - console.log(this.props.limeTempStabilityList) return (
From 5685f54d358c501a9b9510a05af6698ef16c00c7 Mon Sep 17 00:00:00 2001 From: Musacca <38190552+Musacca@users.noreply.github.com> Date: Wed, 22 Jan 2020 20:43:17 +0200 Subject: [PATCH 06/29] small error fix --- src/__tests__/components/chart/PredictionLineChart.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/__tests__/components/chart/PredictionLineChart.test.js b/src/__tests__/components/chart/PredictionLineChart.test.js index d8f0410c..3c83286f 100644 --- a/src/__tests__/components/chart/PredictionLineChart.test.js +++ b/src/__tests__/components/chart/PredictionLineChart.test.js @@ -17,7 +17,6 @@ describe('PredictionLineChart', () => { const element = shallow(); expect(element).toBeDefined(); expect(element.find(ReactApexChart).length).toBe(1); - }); it('renders with non empty data and label', () => { From b7a0833bed28029987b711151875bf94fdaa286f Mon Sep 17 00:00:00 2001 From: Musacca <38190552+Musacca@users.noreply.github.com> Date: Mon, 2 Mar 2020 10:09:07 +0200 Subject: [PATCH 07/29] Testing decision tree --- package-lock.json | 141 +++++++++++++++++- package.json | 2 + src/components/chart/DecisionTree.js | 98 ++++++++++++ .../chart/HorizontalBarChartCard.js | 2 +- src/components/chart/R3DecisionTree.js | 72 +++++++++ src/components/chart/VerticalBarChartCard.js | 100 +++++++++++++ .../explanation/TemporalStability.js | 16 +- src/util/dataReducers.js | 13 ++ src/views/Explanation/Explanation.js | 25 +++- 9 files changed, 455 insertions(+), 14 deletions(-) create mode 100644 src/components/chart/DecisionTree.js create mode 100644 src/components/chart/R3DecisionTree.js create mode 100644 src/components/chart/VerticalBarChartCard.js diff --git a/package-lock.json b/package-lock.json index 2eb01e86..e5dddabf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4279,6 +4279,11 @@ "wrap-ansi": "^2.0.0" } }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, "clone-deep": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", @@ -5049,6 +5054,104 @@ "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" }, + "d3": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" + }, + "d3-color": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", + "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" + }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-ease": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz", + "integrity": "sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==" + }, + "d3-format": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.3.tgz", + "integrity": "sha512-mm/nE2Y9HgGyjP+rKIekeITVgBtX97o1nrvHCWX8F/yBYyevUTvu9vb5pUnKwrcSw7o7GuwMOWjS9gFDs4O+uQ==" + }, + "d3-graphviz": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/d3-graphviz/-/d3-graphviz-2.6.1.tgz", + "integrity": "sha512-878AFSagQyr5tTOrM7YiVYeUC2/NoFcOB3/oew+LAML0xekyJSw9j3WOCUMBsc95KYe9XBYZ+SKKuObVya1tJQ==", + "requires": { + "d3-dispatch": "^1.0.3", + "d3-format": "^1.2.0", + "d3-interpolate": "^1.1.5", + "d3-path": "^1.0.5", + "d3-selection": "^1.1.0", + "d3-timer": "^1.0.6", + "d3-transition": "^1.1.1", + "d3-zoom": "^1.5.0", + "viz.js": "^1.8.2" + } + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-selection": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.1.tgz", + "integrity": "sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA==" + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, "damerau-levenshtein": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", @@ -5113,8 +5216,7 @@ "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" }, "deep-is": { "version": "0.1.3", @@ -7814,6 +7916,27 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, + "graphviz-react": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/graphviz-react/-/graphviz-react-1.0.4.tgz", + "integrity": "sha512-pD9BlD7By+mLL3F4MHWdZhlBJNKR9aqmX6awysQSs1+ztNcELaVbnsUn2WZmcd0c49O6EWUye3aXGw25ypSnWQ==", + "requires": { + "d3-graphviz": "^2.6.0", + "react": "^16.6.0" + }, + "dependencies": { + "react": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", + "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + } + } + }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -14329,6 +14452,20 @@ "pure-color": "^1.2.0" } }, + "react-d3-tree": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/react-d3-tree/-/react-d3-tree-1.16.1.tgz", + "integrity": "sha512-LybzIZM4f4A+/ao6U5OEAZVQbQ08w0wmMYA7TZvPRYQ0QZnSImK9PFTiGR0PW8hVWQqOVJtSZyXlYyJ+M+Uh+A==", + "requires": { + "clone": "^2.1.1", + "d3": "3.5.17", + "deep-equal": "^1.0.1", + "prop-types": "^15.5.10", + "react-lifecycles-compat": "^3.0.4", + "react-transition-group": "^1.1.3", + "uuid": "^3.0.1" + } + }, "react-dev-utils": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-6.1.1.tgz", diff --git a/package.json b/package.json index 959b1b56..eff3aa78 100644 --- a/package.json +++ b/package.json @@ -19,11 +19,13 @@ }, "dependencies": { "apexcharts": "^3.10.1", + "graphviz-react": "^1.0.4", "loader-runner": "^3.0.0", "node-sass": "^4.12.0", "prop-types": "^15.7.2", "react": "16.3.2", "react-apexcharts": "^1.3.3", + "react-d3-tree": "^1.16.1", "react-dom": "16.3.3", "react-ga": "^2.6.0", "react-google-charts": "^2.0.29", diff --git a/src/components/chart/DecisionTree.js b/src/components/chart/DecisionTree.js new file mode 100644 index 00000000..9b66def1 --- /dev/null +++ b/src/components/chart/DecisionTree.js @@ -0,0 +1,98 @@ +/* eslint-disable max-len */ +import React from 'react'; +import {Graphviz} from 'graphviz-react'; +class DecisionTree extends React.Component { + constructor(props) { + super(props); + } + render() { + return prefix_1 ≤ 23.5
gini = 0.5
samples = 100.0%
value = [0.5, 0.5]
class = prefix_2>]; + 1 [fillcolor=cornsilk, label=prefix_2 ≤ 30.5
gini = 0.38
samples = 64.8%
value = [0.255, 0.745]
class = prefix_2>]; + 0 -> 1 [color=steelblue, headlabel="True", labelangle=45, labeldistance="2.5"]; + 2 [fillcolor=cornsilk, label=prefix_2 ≤ 3.5
gini = 0.123
samples = 53.9%
value = [0.066, 0.934]
class = prefix_2>]; + 1 -> 2 [color=steelblue]; + 3 [fillcolor=coral, label=gini = 0.0
samples = 0.4%
value = [1.0, 0.0]
class = prefix_1>]; + 2 -> 3 [color=steelblue]; + 4 [fillcolor=cornsilk, label=prefix_1 ≤ 12.5
gini = 0.099
samples = 53.5%
value = [0.052, 0.948]
class = prefix_2>]; + 2 -> 4 [color=steelblue]; + 5 [fillcolor=lightsteelblue, label=gini = 0.0
samples = 28.5%
value = [0.0, 1.0]
class = prefix_2>]; + 4 -> 5 [color=steelblue]; + 6 [fillcolor=cornsilk, label=prefix_2 ≤ 9.0
gini = 0.193
samples = 25.0%
value = [0.108, 0.892]
class = prefix_2>]; + 4 -> 6 [color=steelblue]; + 7 [fillcolor=lightsteelblue, label=gini = -0.0
samples = 20.2%
value = [0.0, 1.0]
class = prefix_2>]; + 6 -> 7 [color=steelblue]; + 8 [fillcolor=cornsilk, label=prefix_1 ≤ 20.0
gini = 0.498
samples = 4.7%
value = [0.472, 0.528]
class = prefix_2>]; + 6 -> 8 [color=steelblue]; + 9 [fillcolor=coral, label=gini = 0.305
samples = 2.2%
value = [0.812, 0.188]
class = prefix_1>]; + 8 -> 9 [color=steelblue]; + 12 [fillcolor=lightsteelblue, label=gini = 0.0
samples = 2.5%
value = [0.0, 1.0]
class = prefix_2>]; + 8 -> 12 [color=steelblue]; + 13 [fillcolor=cornsilk, label=prefix_1 ≤ 11.5
gini = 0.261
samples = 10.9%
value = [0.846, 0.154]
class = prefix_1>]; + 1 -> 13 [color=steelblue]; + 14 [fillcolor=cornsilk, label=prefix_2 ≤ 35.5
gini = 0.498
samples = 3.1%
value = [0.467, 0.533]
class = prefix_2>]; + 13 -> 14 [color=steelblue]; + 15 [fillcolor=coral, label=gini = 0.0
samples = 0.4%
value = [1.0, 0.0]
class = prefix_1>]; + 14 -> 15 [color=steelblue]; + 16 [fillcolor=cornsilk, label=prefix_1 ≤ 5.5
gini = 0.44
samples = 2.6%
value = [0.327, 0.673]
class = prefix_2>]; + 14 -> 16 [color=steelblue]; + 17 [fillcolor=coral, label=gini = 0.411
samples = 0.8%
value = [0.711, 0.289]
class = prefix_1>]; + 16 -> 17 [color=steelblue]; + 20 [fillcolor=cornsilk, label=prefix_2 ≤ 44.5
gini = 0.186
samples = 1.9%
value = [0.104, 0.896]
class = prefix_2>]; + 16 -> 20 [color=steelblue]; + 21 [fillcolor=lightsteelblue, label=gini = 0.0
samples = 1.8%
value = [0.0, 1.0]
class = prefix_2>]; + 20 -> 21 [color=steelblue]; + 22 [fillcolor=coral, label=gini = 0.0
samples = 0.1%
value = [1.0, 0.0]
class = prefix_1>]; + 20 -> 22 [color=steelblue]; + 23 [fillcolor=cornsilk, label=prefix_1 ≤ 19.5
gini = 0.091
samples = 7.8%
value = [0.952, 0.048]
class = prefix_1>]; + 13 -> 23 [color=steelblue]; + 24 [fillcolor=coral, label=gini = 0.0
samples = 7.2%
value = [1.0, 0.0]
class = prefix_1>]; + 23 -> 24 [color=steelblue]; + 25 [fillcolor=lightsteelblue, label=gini = 0.0
samples = 0.7%
value = [0.0, 1.0]
class = prefix_2>]; + 23 -> 25 [color=steelblue]; + 26 [fillcolor=cornsilk, label=prefix_2 ≤ 7.0
gini = 0.297
samples = 35.2%
value = [0.819, 0.181]
class = prefix_1>]; + 0 -> 26 [color=steelblue, headlabel="False", labelangle="-45", labeldistance="2.5"]; + 27 [fillcolor=cornsilk, label=prefix_2 ≤ 3.5
gini = 0.124
samples = 3.0%
value = [0.066, 0.934]
class = prefix_2>]; + 26 -> 27 [color=steelblue]; + 28 [fillcolor=coral, label=gini = 0.0
samples = 0.1%
value = [1.0, 0.0]
class = prefix_1>]; + 27 -> 28 [color=steelblue]; + 29 [fillcolor=lightsteelblue, label=gini = 0.0
samples = 2.9%
value = [0.0, 1.0]
class = prefix_2>]; + 27 -> 29 [color=steelblue]; + 30 [fillcolor=cornsilk, label=prefix_2 ≤ 42.5
gini = 0.238
samples = 32.2%
value = [0.862, 0.138]
class = prefix_1>]; + 26 -> 30 [color=steelblue]; + 31 [fillcolor=cornsilk, label=prefix_1 ≤ 24.5
gini = 0.179
samples = 29.8%
value = [0.9, 0.1]
class = prefix_1>]; + 30 -> 31 [color=steelblue]; + 32 [fillcolor=coral, label=gini = 0.0
samples = 13.2%
value = [1.0, 0.0]
class = prefix_1>]; + 31 -> 32 [color=steelblue]; + 33 [fillcolor=cornsilk, label=prefix_2 ≤ 23.5
gini = 0.31
samples = 16.6%
value = [0.808, 0.192]
class = prefix_1>]; + 31 -> 33 [color=steelblue]; + 34 [fillcolor=cornsilk, label=prefix_2 ≤ 11.5
gini = 0.07
samples = 11.9%
value = [0.964, 0.036]
class = prefix_1>]; + 33 -> 34 [color=steelblue]; + 35 [fillcolor=coral, label=gini = 0.0
samples = 9.5%
value = [1.0, 0.0]
class = prefix_1>]; + 34 -> 35 [color=steelblue]; + 36 [fillcolor=cornsilk, label=prefix_2 ≤ 15.5
gini = 0.322
samples = 2.4%
value = [0.799, 0.201]
class = prefix_1>]; + 34 -> 36 [color=steelblue]; + 37 [fillcolor=lightsteelblue, label=gini = 0.0
samples = 0.8%
value = [0.0, 1.0]
class = prefix_2>]; + 36 -> 37 [color=steelblue]; + 38 [fillcolor=coral, label=gini = -0.0
samples = 1.7%
value = [1.0, 0.0]
class = prefix_1>]; + 36 -> 38 [color=steelblue]; + 39 [fillcolor=cornsilk, label=prefix_2 ≤ 38.5
gini = 0.268
samples = 4.7%
value = [0.159, 0.841]
class = prefix_2>]; + 33 -> 39 [color=steelblue]; + 40 [fillcolor=lightsteelblue, label=gini = 0.0
samples = 4.3%
value = [0.0, 1.0]
class = prefix_2>]; + 39 -> 40 [color=steelblue]; + 41 [fillcolor=coral, label=gini = 0.0
samples = 0.4%
value = [1.0, 0.0]
class = prefix_1>]; + 39 -> 41 [color=steelblue]; + 42 [fillcolor=cornsilk, label=prefix_2 ≤ 45.0
gini = 0.149
samples = 2.4%
value = [0.081, 0.919]
class = prefix_2>]; + 30 -> 42 [color=steelblue]; + 43 [fillcolor=lightsteelblue, label=gini = 0.0
samples = 2.3%
value = [0.0, 1.0]
class = prefix_2>]; + 42 -> 43 [color=steelblue]; + 44 [fillcolor=coral, label=gini = -0.0
samples = 0.1%
value = [1.0, 0.0]
class = prefix_1>]; + 42 -> 44 [color=steelblue]; + }`} /> + ; + } +} + +export default DecisionTree; diff --git a/src/components/chart/HorizontalBarChartCard.js b/src/components/chart/HorizontalBarChartCard.js index 017be48c..fb29e1a4 100644 --- a/src/components/chart/HorizontalBarChartCard.js +++ b/src/components/chart/HorizontalBarChartCard.js @@ -64,7 +64,7 @@ class HorizontalBarChartCard extends React.Component { } ] }; - const height = this.props.labels.length * 65; + const height = this.props.labels.length * 45; const chart = ( + +
+ ); +} +} +export default R3DecisionTree; + diff --git a/src/components/chart/VerticalBarChartCard.js b/src/components/chart/VerticalBarChartCard.js new file mode 100644 index 00000000..8fed5d7a --- /dev/null +++ b/src/components/chart/VerticalBarChartCard.js @@ -0,0 +1,100 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import ReactApexChart from 'react-apexcharts'; + +class HorizontalBarChartCard extends React.Component { + constructor(props) { + super(props); + } + + render() { + let graph = { + options: { + chart: { + height: 350, + type: 'line', + toolbar: { + show: false + } + }, + plotOptions: { + bar: { + horizontal: false, + distributed: false, + columnWidth: '30%', + barHeight: '80%' + } + }, + dataLabels: { + + enabled: true, + enabledOnSeries: [1], + formatter: function (val, opts) { + return val.toFixed(2); + } + }, + yaxis: [{ + labels: { + formatter: function (val, index) { + return val.toFixed(2); + } + }, + title: { + text: 'Count', + }, + }, { + labels: { + formatter: function (val, index) { + return val.toFixed(2); + } + }, + opposite: true, + title: { + text: 'Label: 0 means False, 1 means True' + } + }], + xaxis: { + labels: { + show: true + }, + axisBorder: { + show: false + }, + axisTicks: { + show: true + }, + categories: this.props.labels + } + }, + series: [ + { + name: 'Count', + type: 'column', + data: this.props.count + }, + { + name: 'Label', + type: 'line', + data: this.props.data + } + ] + }; + const height = 400; + const chart = ( + + ); + + return
{this.props.data.length === 0 ? '' : chart}
; + } +} + +HorizontalBarChartCard.propTypes = { + data: PropTypes.any.isRequired, + labels: PropTypes.any.isRequired, + count: PropTypes.any.isRequired +}; +export default HorizontalBarChartCard; diff --git a/src/components/explanation/TemporalStability.js b/src/components/explanation/TemporalStability.js index c49f7945..c543446b 100644 --- a/src/components/explanation/TemporalStability.js +++ b/src/components/explanation/TemporalStability.js @@ -26,10 +26,11 @@ const TemporalStability = (props) => {
- +
-
+ @@ -40,11 +41,10 @@ const TemporalStability = (props) => { {!props.isPredictionTempStabilityLoaded ? : null} -
- -
+
+ +
diff --git a/src/util/dataReducers.js b/src/util/dataReducers.js index d3ff9f2c..99a7999f 100644 --- a/src/util/dataReducers.js +++ b/src/util/dataReducers.js @@ -283,6 +283,18 @@ export const parseLimeResult = (limeValueList) => { return ({labels: labels, values: values}); }; +export const parseICEResult = (iceResult) => { + let labels = []; + let values = []; + let count = []; + for (let j = 0; j < iceResult.length; j++) { + labels.push(iceResult[j].value); + values.push(iceResult[j].label - 1).toFixed(2); + count.push(iceResult[j].count | 0); + } + return ({labels: labels, values: values, count: count}); +}; + export const parseTemporalStabilityLimeResultList = (predictionList, traceId) => { let data = [[]]; let prefixs = []; @@ -303,6 +315,7 @@ export const parseTemporalStabilityLimeResultList = (predictionList, traceId) => }; export const parseTemporalStabilityPredictionResultList = (predictionList, traceId) => { + let predictions = []; let prefixs = []; if (predictionList[traceId] != null || predictionList[traceId] != undefined) { diff --git a/src/views/Explanation/Explanation.js b/src/views/Explanation/Explanation.js index 88319fb7..ef47ee6a 100644 --- a/src/views/Explanation/Explanation.js +++ b/src/views/Explanation/Explanation.js @@ -25,10 +25,14 @@ import ReactGA from 'react-ga'; import ExplanationHeaderCard from '../../components/explanation/ExplanationHeaderCard'; import PostHocExplanation from '../../components/explanation/post_hoc'; import TraceExplanation from '../../components/explanation/TraceExplanation'; -import {getTraceIdsFromLogs, parseLimeResult} from '../../util/dataReducers'; +import {getTraceIdsFromLogs, parseLimeResult, parseICEResult} from '../../util/dataReducers'; import JobModelsTable from '../../components/explanation/JobModelsTable'; -import PredictionLineChartCard from '../../components/explanation/TemporalStability'; +import TemporalStability from '../../components/explanation/TemporalStability'; import {temporalPredictionListRequested, temporalLimePredictionListRequested} from '../../actions/PredictionAction'; +import DecisionTree from '../../components/chart/DecisionTree'; +import VerticalBarChartCard from '../../components/chart/VerticalBarChartCard'; +import R3DecisionTree from '../../components/chart/R3DecisionTree'; + class Explanation extends Component { constructor(props) { const selectedTrace = ''; @@ -103,6 +107,8 @@ class Explanation extends Component { } render() { + const iceResult = parseICEResult([{'value': 'First outpatient consultation', 'label': 1.25, 'count': 48}, {'value': 'aspiration cytology behalf by p', 'label': 1.6666666666666667, 'count': 3}, {'value': 'assumption laboratory', 'label': 1.6923076923076923, 'count': 130}, {'value': 'compartment for inspection', 'label': 1.6666666666666667, 'count': 12}, {'value': 'ct abdomen', 'label': 2.0, 'count': 2}, {'value': 'cytology - abdominal tumor puncture', 'label': 1.0, 'count': 1}, {'value': 'cytology - ectocervix -', 'label': 1.32, 'count': 25}, {'value': 'cytology - vagina -', 'label': 1.2222222222222223, 'count': 9}, {'value': 'day care - all spec.beh.kind.-rev.', 'label': 1.0, 'count': 2}, {'value': 'demurrage - all spec.beh.kinderg.-Reval.', 'label': 1.7142857142857142, 'count': 28}, {'value': 'e.c.g. - Electrocardiography', 'label': 1.5, 'count': 22}, {'value': 'histological examination - biopsies nno', 'label': 1.3076923076923077, 'count': 13}, {'value': 'immuno-pathology', 'label': 1.25, 'count': 4}, {'value': 'inwend.geneesk. Out-year card costs', 'label': 2.0, 'count': 1}, {'value': 'inwend.geneesk. short-out card cost', 'label': 1.375, 'count': 8}, {'value': 'mammography chest wall', 'label': 1.3333333333333333, 'count': 3}, {'value': 'outpatient follow-up consultation', 'label': 1.087719298245614, 'count': 228}, {'value': 'telephone consultation', 'label': 1.0769230769230769, 'count': 13}, {'value': 'thorax', 'label': 1.375, 'count': 8}, {'value': 'treatment time - Unit t2 - megavolt', 'label': 1.0, 'count': 1}, {'value': 'treatment time - Unit t3 - megavolt', 'label': 1.0, 'count': 1}, {'value': 'ultrasound - internal genitals', 'label': 1.6333333333333333, 'count': 30}] + ); return (
@@ -117,7 +123,20 @@ class Explanation extends Component { jobId={this.props.jobId} />
+ {/*
+ +
*/} +
+ + +
+
+ +
- Date: Mon, 2 Mar 2020 10:12:21 +0200 Subject: [PATCH 08/29] Testing decision tree --- src/util/dataReducers.js | 1 - src/views/Explanation/Explanation.js | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/util/dataReducers.js b/src/util/dataReducers.js index 99a7999f..e5bf6082 100644 --- a/src/util/dataReducers.js +++ b/src/util/dataReducers.js @@ -315,7 +315,6 @@ export const parseTemporalStabilityLimeResultList = (predictionList, traceId) => }; export const parseTemporalStabilityPredictionResultList = (predictionList, traceId) => { - let predictions = []; let prefixs = []; if (predictionList[traceId] != null || predictionList[traceId] != undefined) { diff --git a/src/views/Explanation/Explanation.js b/src/views/Explanation/Explanation.js index ef47ee6a..95880c33 100644 --- a/src/views/Explanation/Explanation.js +++ b/src/views/Explanation/Explanation.js @@ -29,7 +29,6 @@ import {getTraceIdsFromLogs, parseLimeResult, parseICEResult} from '../../util/d import JobModelsTable from '../../components/explanation/JobModelsTable'; import TemporalStability from '../../components/explanation/TemporalStability'; import {temporalPredictionListRequested, temporalLimePredictionListRequested} from '../../actions/PredictionAction'; -import DecisionTree from '../../components/chart/DecisionTree'; import VerticalBarChartCard from '../../components/chart/VerticalBarChartCard'; import R3DecisionTree from '../../components/chart/R3DecisionTree'; @@ -107,6 +106,7 @@ class Explanation extends Component { } render() { + // eslint-disable-next-line max-len const iceResult = parseICEResult([{'value': 'First outpatient consultation', 'label': 1.25, 'count': 48}, {'value': 'aspiration cytology behalf by p', 'label': 1.6666666666666667, 'count': 3}, {'value': 'assumption laboratory', 'label': 1.6923076923076923, 'count': 130}, {'value': 'compartment for inspection', 'label': 1.6666666666666667, 'count': 12}, {'value': 'ct abdomen', 'label': 2.0, 'count': 2}, {'value': 'cytology - abdominal tumor puncture', 'label': 1.0, 'count': 1}, {'value': 'cytology - ectocervix -', 'label': 1.32, 'count': 25}, {'value': 'cytology - vagina -', 'label': 1.2222222222222223, 'count': 9}, {'value': 'day care - all spec.beh.kind.-rev.', 'label': 1.0, 'count': 2}, {'value': 'demurrage - all spec.beh.kinderg.-Reval.', 'label': 1.7142857142857142, 'count': 28}, {'value': 'e.c.g. - Electrocardiography', 'label': 1.5, 'count': 22}, {'value': 'histological examination - biopsies nno', 'label': 1.3076923076923077, 'count': 13}, {'value': 'immuno-pathology', 'label': 1.25, 'count': 4}, {'value': 'inwend.geneesk. Out-year card costs', 'label': 2.0, 'count': 1}, {'value': 'inwend.geneesk. short-out card cost', 'label': 1.375, 'count': 8}, {'value': 'mammography chest wall', 'label': 1.3333333333333333, 'count': 3}, {'value': 'outpatient follow-up consultation', 'label': 1.087719298245614, 'count': 228}, {'value': 'telephone consultation', 'label': 1.0769230769230769, 'count': 13}, {'value': 'thorax', 'label': 1.375, 'count': 8}, {'value': 'treatment time - Unit t2 - megavolt', 'label': 1.0, 'count': 1}, {'value': 'treatment time - Unit t3 - megavolt', 'label': 1.0, 'count': 1}, {'value': 'ultrasound - internal genitals', 'label': 1.6333333333333333, 'count': 30}] ); return ( @@ -125,7 +125,7 @@ class Explanation extends Component {
{/*
-
*/} +
*/}
Date: Wed, 11 Mar 2020 10:49:08 +0200 Subject: [PATCH 09/29] decision tree clickable --- package-lock.json | 43 + package.json | 3 + src/views/Explanation/Explanation.js | 13 +- src/viz.svg | 39004 +++++++++++++++++++++++++ 4 files changed, 39060 insertions(+), 3 deletions(-) create mode 100644 src/viz.svg diff --git a/package-lock.json b/package-lock.json index e5dddabf..6d739884 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1965,12 +1965,26 @@ "integrity": "sha512-DMiqG51GwES/c4ScBY0u5bDlH44+oY8AeYHjY1SGCWidD7h08o1dfHue/TGK7REmif2KiJzaUskO+Q0eaeZ2fQ==", "dev": true }, + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + }, "@types/q": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", "dev": true }, + "@types/react": { + "version": "16.9.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.23.tgz", + "integrity": "sha512-SsGVT4E7L2wLN3tPYLiF20hmZTPGuzaayVunfgXzUn1x4uHVsKH6QDJQ/TdpHqwsTLd4CwrmQ2vOgxN7gE24gw==", + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + }, "@types/tapable": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.2.tgz", @@ -5041,6 +5055,11 @@ "cssom": "0.3.x" } }, + "csstype": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.9.tgz", + "integrity": "sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q==" + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -7174,6 +7193,11 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "fscreen": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fscreen/-/fscreen-1.0.2.tgz", + "integrity": "sha1-xMUdltgZ11oZ1yjg30Rfm+m7mE8=" + }, "fsevents": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", @@ -14441,6 +14465,11 @@ } } }, + "react-aspect-ratio": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/react-aspect-ratio/-/react-aspect-ratio-1.0.42.tgz", + "integrity": "sha512-TlDS7GZ6Fot6yMo1OYWrcxI/cggGsU4xsfXLastv6FfcZq0e99LeMq+OUbrlEjtOzi00QzNvkoj5T2vDqJNAmw==" + }, "react-base16-styling": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.5.3.tgz", @@ -14738,6 +14767,20 @@ } } }, + "react-full-screen": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/react-full-screen/-/react-full-screen-0.2.4.tgz", + "integrity": "sha512-K6V87g/uopQnnebg6/jM7VL3FcurgCIQU4nTkzknbjGOT9XOOxr3XVwRweI8QPn1TFRZH7j5OpHanUdk5uYlBQ==", + "requires": { + "@types/react": "*", + "fscreen": "^1.0.1" + } + }, + "react-fullscreen-image": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/react-fullscreen-image/-/react-fullscreen-image-0.0.3.tgz", + "integrity": "sha512-A4zXvDox4WConU/qUpOKUCoRmV2mGi2DPTXNhG9I1x+W8WWwpKQMmrbWjLAe/UudhtpJRlebkIC3sPU6IHR3Nw==" + }, "react-fuzzy": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/react-fuzzy/-/react-fuzzy-0.5.2.tgz", diff --git a/package.json b/package.json index eff3aa78..64045366 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,11 @@ "prop-types": "^15.7.2", "react": "16.3.2", "react-apexcharts": "^1.3.3", + "react-aspect-ratio": "^1.0.42", "react-d3-tree": "^1.16.1", "react-dom": "16.3.3", + "react-full-screen": "^0.2.4", + "react-fullscreen-image": "0.0.3", "react-ga": "^2.6.0", "react-google-charts": "^2.0.29", "react-grid-system": "^6.0.3", diff --git a/src/views/Explanation/Explanation.js b/src/views/Explanation/Explanation.js index 95880c33..f3f79c6c 100644 --- a/src/views/Explanation/Explanation.js +++ b/src/views/Explanation/Explanation.js @@ -30,7 +30,8 @@ import JobModelsTable from '../../components/explanation/JobModelsTable'; import TemporalStability from '../../components/explanation/TemporalStability'; import {temporalPredictionListRequested, temporalLimePredictionListRequested} from '../../actions/PredictionAction'; import VerticalBarChartCard from '../../components/chart/VerticalBarChartCard'; -import R3DecisionTree from '../../components/chart/R3DecisionTree'; +import viz from '../../viz.svg'; +import AspectRatio from 'react-aspect-ratio'; class Explanation extends Component { constructor(props) { @@ -133,10 +134,16 @@ class Explanation extends Component { labels = {iceResult.labels}>
+
+ + svg + +
- -
+ +G + + +cluster_legend + + + +node8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node8->leaf9 + + + + + +leaf20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node8->leaf20 + + + + + +node2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node2->node8 + + + + + +node29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node2->leaf3 + + + + + +node39 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf40 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node39->leaf40 + + + + + +leaf41 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node39->leaf41 + + + + + +leaf42 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node38 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node38->node39 + + + + + +node38->leaf42 + + + + + +node36 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node36->node38 + + + + + +leaf37 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node36->leaf37 + + + + + +node34 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node34->node36 + + + + + +leaf35 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node34->leaf35 + + + + + +node32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node32->node34 + + + + + +leaf33 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node32->leaf33 + + + + + +leaf43 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node31 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node31->node32 + + + + + +node44 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node31->leaf43 + + + + + +node48 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node51 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf49 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node48->leaf49 + + + + + +leaf50 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node48->leaf50 + + + + + +node52 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf53 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node52->leaf53 + + + + + +leaf54 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node52->leaf54 + + + + + +leaf55 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node51->node52 + + + + + +node51->leaf55 + + + + + +node47 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node47->node48 + + + + + +node47->node51 + + + + + +leaf56 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node46 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node46->node47 + + + + + +node46->leaf56 + + + + + +node44->node46 + + + + + +leaf45 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node44->leaf45 + + + + + +node30 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node30->node31 + + + + + +node30->node44 + + + + + +leaf57 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node29->node30 + + + + + +node29->leaf57 + + + + + +node1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node1->node2 + + + + + +node1->node29 + + + + + +node58 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node62 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node65 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf63 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node62->leaf63 + + + + + +leaf64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node62->leaf64 + + + + + +leaf66 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node65->leaf66 + + + + + +leaf67 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node65->leaf67 + + + + + +node61 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node61->node62 + + + + + +node61->node65 + + + + + +node68 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node71 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf72 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node71->leaf72 + + + + + +leaf73 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node71->leaf73 + + + + + +node69 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node69->node71 + + + + + +node74 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf70 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node69->leaf70 + + + + + +node80 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf81 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node80->leaf81 + + + + + +leaf82 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node80->leaf82 + + + + + +node78 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node78->node80 + + + + + +node83 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf79 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node78->leaf79 + + + + + +node85 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf86 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node85->leaf86 + + + + + +leaf87 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node85->leaf87 + + + + + +node83->node85 + + + + + +leaf84 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node83->leaf84 + + + + + +node77 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node77->node78 + + + + + +node77->node83 + + + + + +leaf88 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node76 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node76->node77 + + + + + +node89 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node76->leaf88 + + + + + +node90 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node93 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf91 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node90->leaf91 + + + + + +leaf92 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node90->leaf92 + + + + + +node96 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf97 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node96->leaf97 + + + + + +leaf98 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node96->leaf98 + + + + + +node94 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node94->node96 + + + + + +leaf95 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node94->leaf95 + + + + + +leaf99 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node93->node94 + + + + + +node93->leaf99 + + + + + +node89->node90 + + + + + +node89->node93 + + + + + +node75 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node75->node76 + + + + + +node75->node89 + + + + + +leaf100 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node74->node75 + + + + + +node74->leaf100 + + + + + +node68->node69 + + + + + +node68->node74 + + + + + +node60 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node60->node61 + + + + + +node60->node68 + + + + + +node101 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node107 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf108 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node107->leaf108 + + + + + +leaf109 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node107->leaf109 + + + + + +node105 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node105->node107 + + + + + +node110 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf106 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node105->leaf106 + + + + + +node112 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf113 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node112->leaf113 + + + + + +leaf114 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node112->leaf114 + + + + + +node110->node112 + + + + + +leaf111 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node110->leaf111 + + + + + +node104 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node104->node105 + + + + + +node104->node110 + + + + + +node115 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node119 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node119->leaf120 + + + + + +leaf121 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node119->leaf121 + + + + + +leaf122 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node118 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node118->node119 + + + + + +node118->leaf122 + + + + + +node116 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node116->node118 + + + + + +node123 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf117 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node116->leaf117 + + + + + +leaf124 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node123->leaf124 + + + + + +leaf125 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node123->leaf125 + + + + + +node115->node116 + + + + + +node115->node123 + + + + + +node103 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node103->node104 + + + + + +node103->node115 + + + + + +node126 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node130 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node133 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf131 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node130->leaf131 + + + + + +leaf132 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node130->leaf132 + + + + + +node134 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf135 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node134->leaf135 + + + + + +leaf136 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node134->leaf136 + + + + + +leaf137 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node133->node134 + + + + + +node133->leaf137 + + + + + +node129 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node129->node130 + + + + + +node129->node133 + + + + + +node127 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node127->node129 + + + + + +node138 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf128 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node127->leaf128 + + + + + +node139 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node142 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node139->leaf140 + + + + + +leaf141 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node139->leaf141 + + + + + +node145 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf146 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node145->leaf146 + + + + + +leaf147 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node145->leaf147 + + + + + +node143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node143->node145 + + + + + +leaf144 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node143->leaf144 + + + + + +leaf148 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node142->node143 + + + + + +node142->leaf148 + + + + + +node138->node139 + + + + + +node138->node142 + + + + + +node126->node127 + + + + + +node126->node138 + + + + + +node102 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node102->node103 + + + + + +node102->node126 + + + + + +node149 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node152 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf153 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node152->leaf153 + + + + + +leaf154 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node152->leaf154 + + + + + +node150 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node150->node152 + + + + + +leaf151 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node150->leaf151 + + + + + +leaf155 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node149->node150 + + + + + +node149->leaf155 + + + + + +node101->node102 + + + + + +node101->node149 + + + + + +node59 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node59->node60 + + + + + +node59->node101 + + + + + +node156 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node158 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node161 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf159 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node158->leaf159 + + + + + +leaf160 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node158->leaf160 + + + + + +node165 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf166 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node165->leaf166 + + + + + +leaf167 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node165->leaf167 + + + + + +node163 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node163->node165 + + + + + +leaf164 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node163->leaf164 + + + + + +leaf168 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node162 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node162->node163 + + + + + +node169 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node162->leaf168 + + + + + +leaf170 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node169->leaf170 + + + + + +leaf171 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node169->leaf171 + + + + + +node161->node162 + + + + + +node161->node169 + + + + + +node157 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node157->node158 + + + + + +node157->node161 + + + + + +node172 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node176 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf177 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node176->leaf177 + + + + + +leaf178 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node176->leaf178 + + + + + +leaf179 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node175 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node175->node176 + + + + + +node180 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node175->leaf179 + + + + + +node182 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf183 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node182->leaf183 + + + + + +leaf184 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node182->leaf184 + + + + + +node180->node182 + + + + + +leaf181 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node180->leaf181 + + + + + +node174 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node174->node175 + + + + + +node174->node180 + + + + + +node185 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node195 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node198 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf196 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node195->leaf196 + + + + + +leaf197 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node195->leaf197 + + + + + +node205 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf206 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node205->leaf206 + + + + + +leaf207 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node205->leaf207 + + + + + +node203 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node203->node205 + + + + + +leaf204 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node203->leaf204 + + + + + +leaf208 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node202 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node202->node203 + + + + + +node202->leaf208 + + + + + +node200 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node200->node202 + + + + + +leaf201 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node200->leaf201 + + + + + +node198->node200 + + + + + +leaf199 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node198->leaf199 + + + + + +node194 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node194->node195 + + + + + +node194->node198 + + + + + +leaf209 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node193 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node193->node194 + + + + + +node193->leaf209 + + + + + +node191 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node191->node193 + + + + + +leaf192 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node191->leaf192 + + + + + +leaf210 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node190 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node190->node191 + + + + + +node190->leaf210 + + + + + +node188 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node188->node190 + + + + + +leaf189 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node188->leaf189 + + + + + +node186 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node186->node188 + + + + + +node211 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf187 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node186->leaf187 + + + + + +leaf212 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node211->leaf212 + + + + + +leaf213 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node211->leaf213 + + + + + +node185->node186 + + + + + +node185->node211 + + + + + +node173 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node173->node174 + + + + + +node173->node185 + + + + + +node214 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node222 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf223 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node222->leaf223 + + + + + +leaf224 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node222->leaf224 + + + + + +node220 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node220->node222 + + + + + +leaf221 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node220->leaf221 + + + + + +leaf225 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node219 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node219->node220 + + + + + +node219->leaf225 + + + + + +node217 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node217->node219 + + + + + +node226 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf218 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node217->leaf218 + + + + + +node230 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf231 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node230->leaf231 + + + + + +leaf232 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node230->leaf232 + + + + + +node228 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node228->node230 + + + + + +leaf229 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node228->leaf229 + + + + + +node226->node228 + + + + + +leaf227 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node226->leaf227 + + + + + +node216 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node216->node217 + + + + + +node216->node226 + + + + + +node233 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node238 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf239 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node238->leaf239 + + + + + +leaf240 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node238->leaf240 + + + + + +leaf241 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node237 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node237->node238 + + + + + +node237->leaf241 + + + + + +node235 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node235->node237 + + + + + +leaf236 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node235->leaf236 + + + + + +leaf242 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node234 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node234->node235 + + + + + +node243 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node234->leaf242 + + + + + +node244 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf245 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node244->leaf245 + + + + + +leaf246 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node244->leaf246 + + + + + +leaf247 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node243->node244 + + + + + +node243->leaf247 + + + + + +node233->node234 + + + + + +node233->node243 + + + + + +node215 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node215->node216 + + + + + +node215->node233 + + + + + +node248 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node250 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +leaf251 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node250->leaf251 + + + + + +leaf252 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node250->leaf252 + + + + + +node248->node250 + + + + + +leaf249 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node248->leaf249 + + + + + +node214->node215 + + + + + +node214->node248 + + + + + +node172->node173 + + + + + +node172->node214 + + + + + +node156->node157 + + + + + +node156->node172 + + + + + +node58->node59 + + + + + +node58->node156 + + + + + +node0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +node0->node1 + + +< + + + +node0->node58 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +legend + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 3c99b74d4a1a95c5ba4e0859b534699597dd6e37 Mon Sep 17 00:00:00 2001 From: Musacca Date: Tue, 17 Mar 2020 13:41:03 +0200 Subject: [PATCH 10/29] Mock design for SHAP, Skater, ICE is ready --- package-lock.json | 46 +- package.json | 5 +- src/actions/ExplanationActions.js | 28 + src/actions/ServerActions.js | 36 + .../chart/HorizontalBarChartCard.js | 2 +- src/components/explanation/FairMLResult.js | 55 + src/components/explanation/ICEResult.js | 46 + src/components/explanation/ShapResult.js | 58 + src/components/explanation/SkaterResult.js | 42 + src/middlewares/ServerMiddleware.js | 10 +- src/mock_data/Template.js | 7 + src/mock_data/dependence_plot.png | Bin 0 -> 26054 bytes src/mock_data/explainer.html | 32 + src/mock_data/scratch.png | Bin 0 -> 18776 bytes src/mock_data/test.txt | 1128 + src/mock_data/viz.svg | 1 + src/reducers/Explanation.js | 0 src/util/dataReducers.js | 16 +- src/views/Explanation/Explanation.js | 46 +- src/viz.svg | 39004 ---------------- 20 files changed, 1527 insertions(+), 39035 deletions(-) create mode 100644 src/actions/ExplanationActions.js create mode 100644 src/components/explanation/FairMLResult.js create mode 100644 src/components/explanation/ICEResult.js create mode 100644 src/components/explanation/ShapResult.js create mode 100644 src/components/explanation/SkaterResult.js create mode 100644 src/mock_data/Template.js create mode 100644 src/mock_data/dependence_plot.png create mode 100644 src/mock_data/explainer.html create mode 100644 src/mock_data/scratch.png create mode 100644 src/mock_data/test.txt create mode 100644 src/mock_data/viz.svg create mode 100644 src/reducers/Explanation.js delete mode 100644 src/viz.svg diff --git a/package-lock.json b/package-lock.json index 6d739884..7f92c456 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2246,6 +2246,14 @@ "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", "dev": true }, + "add-filename-increment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-filename-increment/-/add-filename-increment-1.0.0.tgz", + "integrity": "sha512-pFV8VZX8jxuVMIycKvGZkWF/ihnUubu9lbQVnOnZWp7noVxbKQTNj7zG2y9fXdPcuZ6lAN3Drr517HaivGCjdQ==", + "requires": { + "strip-filename-increment": "^2.0.1" + } + }, "address": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz", @@ -5613,6 +5621,11 @@ "domelementtype": "1" } }, + "dompurify": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.0.8.tgz", + "integrity": "sha512-vIOSyOXkMx81ghEalh4MLBtDHMx1bhKlaqHDMqM2yeitJ996SLOk5mGdDpI9ifJAgokred8Rmu219fX4OltqXw==" + }, "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", @@ -7017,6 +7030,17 @@ "graceful-fs": "^4.1.2", "rimraf": "~2.6.2", "write": "^0.2.1" + }, + "dependencies": { + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + } } }, "flatten": { @@ -17857,6 +17881,11 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-filename-increment": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-filename-increment/-/strip-filename-increment-2.0.1.tgz", + "integrity": "sha512-+v5xsiTTsdYqkPj7qz1zlngIsjZedhHDi3xp/9bMurV8kXe9DAr732gNVqtt4X8sI3hOqS3nlFfps5gyVcux6w==" + }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", @@ -17923,6 +17952,14 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, + "svg-inline-react": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svg-inline-react/-/svg-inline-react-3.2.0.tgz", + "integrity": "sha512-LofK2PJpIsvvi9lJdFe1RW3mhHPg4LvO/3Z1wEdz4Ksr/REPc+IW67i3Y3orGDk+qIa3LrTb0Rt6do8ClKriAw==", + "requires": { + "prop-types": "^15.5.0" + } + }, "svg-url-loader": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/svg-url-loader/-/svg-url-loader-2.3.2.tgz", @@ -19882,12 +19919,11 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/write/-/write-2.0.0.tgz", + "integrity": "sha512-yam9TAqN8sAZokECAejo9HpT2j2s39OgK8i8yxadrFBVo+iSWLfnipRVFulfAw1d2dz5vSuGmlMHYRKG4fysOA==", "requires": { - "mkdirp": "^0.5.1" + "add-filename-increment": "^1.0.0" } }, "write-file-atomic": { diff --git a/package.json b/package.json index 64045366..6b589cf4 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ }, "dependencies": { "apexcharts": "^3.10.1", + "dompurify": "^2.0.8", "graphviz-react": "^1.0.4", "loader-runner": "^3.0.0", "node-sass": "^4.12.0", @@ -42,9 +43,11 @@ "react-router-redux": "^4.0.8", "redux": "^3.6.0", "redux-thunk": "^2.2.0", + "svg-inline-react": "^3.2.0", "viz.js": "^1.8.0", "webfontloader": "^1.6.27", - "webpack": "^4.28.3" + "webpack": "^4.28.3", + "write": "^2.0.0" }, "scripts": { "start": "react-scripts start", diff --git a/src/actions/ExplanationActions.js b/src/actions/ExplanationActions.js new file mode 100644 index 00000000..79e48023 --- /dev/null +++ b/src/actions/ExplanationActions.js @@ -0,0 +1,28 @@ +import {createPayloadForwardingAction} from './index'; +export const LIME_VALUE_LIST_REQUESTED = 'LIME_VALUE_LIST_REQUESTED'; +export const limeValueListRequested = createPayloadForwardingAction(LIME_VALUE_LIST_REQUESTED); +export const LIME_VALUE_LIST_RETRIEVED = 'LIME_VALUE_LIST_RETRIEVED'; +export const limeValueListRetrieved = createPayloadForwardingAction(LIME_VALUE_LIST_RETRIEVED); +export const LIME_VALUE_LIST_FAILED = 'LIME_VALUE_LIST_FAILED'; +export const limeValueListFailed = createPayloadForwardingAction(LIME_VALUE_LIST_FAILED); + +export const ICE_VALUE_LIST_REQUESTED = 'ICE_VALUE_LIST_REQUESTED'; +export const iceValueListRequested = createPayloadForwardingAction(ICE_VALUE_LIST_REQUESTED); +export const ICE_VALUE_LIST_RETRIEVED = 'ICE_VALUE_LIST_RETRIEVED'; +export const iceValueListRetrieved = createPayloadForwardingAction(ICE_VALUE_LIST_RETRIEVED); +export const ICE_VALUE_LIST_FAILED = 'ICE_VALUE_LIST_FAILED'; +export const iceValueListFailed = createPayloadForwardingAction(ICE_VALUE_LIST_FAILED); + +export const SHAP_VALUE_LIST_REQUESTED = 'SHAP_VALUE_LIST_REQUESTED'; +export const shapValueListRequested = createPayloadForwardingAction(SHAP_VALUE_LIST_REQUESTED); +export const SHAP_VALUE_LIST_RETRIEVED = 'SHAP_VALUE_LIST_RETRIEVED'; +export const shapValueListRetrieved = createPayloadForwardingAction(SHAP_VALUE_LIST_RETRIEVED); +export const SHAP_VALUE_LIST_FAILED = 'SHAP_VALUE_LIST_FAILED'; +export const shapValueListFailed = createPayloadForwardingAction(SHAP_VALUE_LIST_FAILED); + +export const SKATER_VALUE_LIST_REQUESTED = 'SKATER_VALUE_LIST_REQUESTED'; +export const skaterValueListRequested = createPayloadForwardingAction(SKATER_VALUE_LIST_REQUESTED); +export const SKATER_VALUE_LIST_RETRIEVED = 'SKATER_VALUE_LIST_RETRIEVED'; +export const skaterValueListRetrieved = createPayloadForwardingAction(SKATER_VALUE_LIST_RETRIEVED); +export const SKATER_VALUE_LIST_FAILED = 'SKATER_VALUE_LIST_FAILED'; +export const skaterValueListFailed = createPayloadForwardingAction(SKATER_VALUE_LIST_FAILED); diff --git a/src/actions/ServerActions.js b/src/actions/ServerActions.js index b4d11f4a..e473fec9 100644 --- a/src/actions/ServerActions.js +++ b/src/actions/ServerActions.js @@ -141,6 +141,42 @@ export const getLimeValues = ({jobId, traceId}) => (dispatch) => { ); }; +export const getShapValues = ({jobId, traceId}) => (dispatch) => { + jsonAjax( + SERVER_URL + `/explanation/shap/${jobId}&${traceId}/`, + 'GET', + null, + (limeList) => { + dispatch(limeValueListRetrieved(limeList)); + }, + ({error}) => dispatch(limeValueListFailed(error)) + ); +}; + +export const getSkaterValues = ({jobId, traceId}) => (dispatch) => { + jsonAjax( + SERVER_URL + `/explanation/skater/${jobId}&${traceId}/`, + 'GET', + null, + (limeList) => { + dispatch(limeValueListRetrieved(limeList)); + }, + ({error}) => dispatch(limeValueListFailed(error)) + ); +}; + +export const getIceValues = ({jobId, traceId}) => (dispatch) => { + jsonAjax( + SERVER_URL + `/explanation/ice/${jobId}&${traceId}/`, + 'GET', + null, + (limeList) => { + dispatch(limeValueListRetrieved(limeList)); + }, + ({error}) => dispatch(limeValueListFailed(error)) + ); +}; + export const getLimeTemporalStabilityValues = ({jobId, traceId}) => (dispatch) => { jsonAjax( SERVER_URL + `/explanation/lime_temporal_stability/${jobId}&${traceId}/`, diff --git a/src/components/chart/HorizontalBarChartCard.js b/src/components/chart/HorizontalBarChartCard.js index fb29e1a4..e596977b 100644 --- a/src/components/chart/HorizontalBarChartCard.js +++ b/src/components/chart/HorizontalBarChartCard.js @@ -54,7 +54,7 @@ class HorizontalBarChartCard extends React.Component { axisTicks: { show: true }, - categories: this.props.labels + categories: this.props.labels, } }, series: [ diff --git a/src/components/explanation/FairMLResult.js b/src/components/explanation/FairMLResult.js new file mode 100644 index 00000000..ac4c2dba --- /dev/null +++ b/src/components/explanation/FairMLResult.js @@ -0,0 +1,55 @@ +import React, {PureComponent} from 'react'; +import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; +import PropTypes from 'prop-types'; +import SelectField from 'react-md/lib/SelectFields'; +import HorizontalBarChartCard from '../../components/chart/HorizontalBarChartCard'; +import {parseFairMLResult} from '../../util/dataReducers'; + +class ShapResult extends PureComponent { + constructor(props) { + super(props); + this.state = { + }; + } + getTraceSelector() { + return ( + + ); + } + + render() { + const fairMLResult = parseFairMLResult([{'label': 'Age_1', 'value': 0.5}, + {'label': 'CType_1', 'value': 0.5}, + {'label': 'ClType_1', 'value': 0.5}, + {'label': 'ClaimValue_1', 'value': 0.5}, + {'label': 'PClaims_1', 'value': 0.5}, + {'label': 'lifecycle:transition_1', 'value': 0.5}, + {'label': 'org:resource_1', 'value': 0.5}]); + const horizontalBarChart = ; + return ( +
+

FairML result

+
+

Select the prefix

+ {this.getTraceSelector()} +
+
{horizontalBarChart}
+ +
+ ); + } +} +ShapResult.propTypes = { + iceResult: PropTypes.any, + jobId: PropTypes.any, +}; +export default ShapResult; diff --git a/src/components/explanation/ICEResult.js b/src/components/explanation/ICEResult.js new file mode 100644 index 00000000..e2b581b0 --- /dev/null +++ b/src/components/explanation/ICEResult.js @@ -0,0 +1,46 @@ +import React, {PureComponent} from 'react'; +import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; +import PropTypes from 'prop-types'; +import VerticalBarChartCard from '../../components/chart/VerticalBarChartCard'; +import SelectField from 'react-md/lib/SelectFields'; + +class ShapResult extends PureComponent { + constructor(props) { + super(props); + this.state = { + }; + } + getTraceSelector() { + return ( + + ); + } + render() { + return ( +
+

ICE result

+
+

Select the prefix

+ {this.getTraceSelector()} +
+ + +
+ ); + } +} +ShapResult.propTypes = { + iceResult: PropTypes.any, + jobId: PropTypes.any, +}; +export default ShapResult; diff --git a/src/components/explanation/ShapResult.js b/src/components/explanation/ShapResult.js new file mode 100644 index 00000000..04367d8c --- /dev/null +++ b/src/components/explanation/ShapResult.js @@ -0,0 +1,58 @@ +import React, {PureComponent} from 'react'; +import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; +import PropTypes from 'prop-types'; +import {Row} from 'react-grid-system'; +import SelectField from 'react-md/lib/SelectFields'; +import scratch from '../../mock_data/scratch.png'; +import dependencePlot from '../../mock_data/dependence_plot.png'; + +class ShapResult extends PureComponent { + constructor(props) { + super(props); + this.state = { + }; + } + + getTraceSelector() { + return ( + + ); + } + render() { + return ( +
+ + + + svg + + + + +

Select the trace composition

+ {this.getTraceSelector()} +
+ svg +
+
+
+ ); + } +} +ShapResult.propTypes = { + shapGeneralResult: PropTypes.any.isRequired, + shapSpecificTraceIdResult: PropTypes.any.isRequired, + shapSummaryPlotResult: PropTypes.any.isRequired, + traceId: PropTypes.any, + jobId: PropTypes.any, + traceIdList: PropTypes.any.isRequired, + shapSelectedTrace: PropTypes.string.isRequired +}; +export default ShapResult; diff --git a/src/components/explanation/SkaterResult.js b/src/components/explanation/SkaterResult.js new file mode 100644 index 00000000..af84b411 --- /dev/null +++ b/src/components/explanation/SkaterResult.js @@ -0,0 +1,42 @@ +import React, {PureComponent} from 'react'; +import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; +import PropTypes from 'prop-types'; +import viz from '../../mock_data/viz.svg'; +import InlineSVG from 'svg-inline-react'; + +class ShapResult extends PureComponent { + constructor(props) { + super(props); + this.state = { + }; + } + + render() { + const svgSource = `\n\nG\n\n\ncluster_legend\n\n\n\nnode2\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nleaf3\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nnode2->leaf3\n\n\n\n\n\nleaf4\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nnode2->leaf4\n\n\n\n\n\nleaf5\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\n\nnode1\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nnode1->node2\n\n\n\n\n\nnode1->leaf5\n\n\n\n\n\nleaf6\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\n\nnode0\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nnode0->node1\n\n\n<\n\n\n\nnode0->leaf6\n\n\n\n\n\n\n\nlegend\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n`; + + return ( +
+
+

Skater result

+ this.showSvgNewPage(svgSource)} style={{display: 'flex', justifyContent:'center', alignItems:'center'}} href preserveAspectRatio="xMidYMid slice" className="md-cell md-cell--12" alt="svg" src={svgSource} /> + +
+
+ ); + } + + showSvgNewPage(svg){ + let v = window.open("") + v.document.write(svg) + } +} +ShapResult.propTypes = { + shapGeneralResult: PropTypes.any.isRequired, + shapSpecificTraceIdResult: PropTypes.any.isRequired, + shapSummaryPlotResult: PropTypes.any.isRequired, + traceId: PropTypes.any, + jobId: PropTypes.any, + traceIdList: PropTypes.any.isRequired, + shapSelectedTrace: PropTypes.string.isRequired +}; +export default ShapResult; diff --git a/src/middlewares/ServerMiddleware.js b/src/middlewares/ServerMiddleware.js index 2a60e1dd..8de4272c 100644 --- a/src/middlewares/ServerMiddleware.js +++ b/src/middlewares/ServerMiddleware.js @@ -12,12 +12,15 @@ import { postTraining, getLimeValues, getLimeTemporalStabilityValues, - getPredictionTemporalStabilityValues + getPredictionTemporalStabilityValues, + getShapValues, + getIceValues, + getSkaterValues } from '../actions/ServerActions'; import {JOB_DELETE_REQUESTED, JOBS_REQUESTED, TRAINING_SUBMITTED} from '../actions/JobActions'; import {TRACE_LIST_REQUESTED} from '../actions/TraceActions'; import {LOG_INFO_REQUESTED, LOG_LIST_REQUESTED} from '../actions/LogActions'; -import {LIME_VALUE_LIST_REQUESTED} from '../actions/LimeActions'; +import {LIME_VALUE_LIST_REQUESTED, SHAP_VALUE_LIST_REQUESTED, ICE_VALUE_LIST_REQUESTED, SKATER_VALUE_LIST_REQUESTED} from '../actions/ExplanationActions'; import {SPLIT_SUBMITTED, SPLITS_REQUESTED} from '../actions/SplitActions'; import {MODELS_REQUESTED} from '../actions/ModelActions'; import {PREDICTION_SUBMITTED, REPLAY_SUBMITTED} from '../actions/RuntimeActions'; @@ -37,6 +40,9 @@ const ACTION_TYPE_TO_SERVER_ACTION = { [MODELS_REQUESTED]: getModels, [JOB_DELETE_REQUESTED]: deleteJob, [LIME_VALUE_LIST_REQUESTED]: getLimeValues, + [SHAP_VALUE_LIST_REQUESTED]: getShapValues, + [ICE_VALUE_LIST_REQUESTED]: getIceValues, + [SKATER_VALUE_LIST_REQUESTED]: getSkaterValues, [TEMPORAL_STABILITY_LIME_PREDICTION_LIST_REQUESTED]: getLimeTemporalStabilityValues, [TEMPORAL_STABILITY_PREDICTION_LIST_REQUESTED]: getPredictionTemporalStabilityValues, diff --git a/src/mock_data/Template.js b/src/mock_data/Template.js new file mode 100644 index 00000000..025a5960 --- /dev/null +++ b/src/mock_data/Template.js @@ -0,0 +1,7 @@ +import React from 'react'; +let Template = React.createReactClass({ + render: function () { + return (
Mi HTML
); + } +}); +module.exports = Template; diff --git a/src/mock_data/dependence_plot.png b/src/mock_data/dependence_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..83c4717d1f0fdfcf994b829208c346d82b38e6bd GIT binary patch literal 26054 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 E3r2MPOaK4? literal 0 HcmV?d00001 diff --git a/src/mock_data/explainer.html b/src/mock_data/explainer.html new file mode 100644 index 00000000..5a0c5557 --- /dev/null +++ b/src/mock_data/explainer.html @@ -0,0 +1,32 @@ + + +
+
+ Visualization omitted, Javascript library not loaded!
+ Have you run `initjs()` in this notebook? If this notebook was from another + user you must also trust this notebook (File -> Trust notebook). If you are viewing + this notebook on github the Javascript has been stripped for security. If you are using + JupyterLab this error is because a JupyterLab extension has not yet been written. +
+ diff --git a/src/mock_data/scratch.png b/src/mock_data/scratch.png new file mode 100644 index 0000000000000000000000000000000000000000..06a73538b28df2a5ad28cce7bebda162ea8b687c GIT binary patch literal 18776 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
    n@83Y?Vhi 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 D_DB1f literal 0 HcmV?d00001 diff --git a/src/mock_data/test.txt b/src/mock_data/test.txt new file mode 100644 index 00000000..f8deee10 --- /dev/null +++ b/src/mock_data/test.txt @@ -0,0 +1,1128 @@ + "\n", + "\n", + "G\n", + "\n", + "\n", + "cluster_legend\n", + "\n", + "\n", + "\n", + "node2\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "leaf3\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "node2->leaf3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "leaf4\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "node2->leaf4\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "leaf5\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "node1\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "node1->node2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "node1->leaf5\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "leaf6\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "node0\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "node0->node1\n", + "\n", + "\n", + "<\n", + "\n", + "\n", + "\n", + "node0->leaf6\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "legend\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "" \ No newline at end of file diff --git a/src/mock_data/viz.svg b/src/mock_data/viz.svg new file mode 100644 index 00000000..f906151f --- /dev/null +++ b/src/mock_data/viz.svg @@ -0,0 +1 @@ +\n\nG\n\n\ncluster_legend\n\n\n\nnode2\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nleaf3\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nnode2->leaf3\n\n\n\n\n\nleaf4\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nnode2->leaf4\n\n\n\n\n\nleaf5\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\n\nnode1\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nnode1->node2\n\n\n\n\n\nnode1->leaf5\n\n\n\n\n\nleaf6\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\n\nnode0\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nnode0->node1\n\n\n<\n\n\n\nnode0->leaf6\n\n\n\n\n\n\n\nlegend\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n \ No newline at end of file diff --git a/src/reducers/Explanation.js b/src/reducers/Explanation.js new file mode 100644 index 00000000..e69de29b diff --git a/src/util/dataReducers.js b/src/util/dataReducers.js index e5bf6082..670cc282 100644 --- a/src/util/dataReducers.js +++ b/src/util/dataReducers.js @@ -288,8 +288,20 @@ export const parseICEResult = (iceResult) => { let values = []; let count = []; for (let j = 0; j < iceResult.length; j++) { - labels.push(iceResult[j].value); - values.push(iceResult[j].label - 1).toFixed(2); + labels.push(iceResult[j].label); + values.push(iceResult[j].value - 1).toFixed(2); + count.push(iceResult[j].count | 0); + } + return ({labels: labels, values: values, count: count}); +}; + +export const parseFairMLResult = (iceResult) => { + let labels = []; + let values = []; + let count = []; + for (let j = 0; j < iceResult.length; j++) { + labels.push(iceResult[j].label); + values.push(iceResult[j].value).toFixed(2); count.push(iceResult[j].count | 0); } return ({labels: labels, values: values, count: count}); diff --git a/src/views/Explanation/Explanation.js b/src/views/Explanation/Explanation.js index f3f79c6c..be02ac54 100644 --- a/src/views/Explanation/Explanation.js +++ b/src/views/Explanation/Explanation.js @@ -29,9 +29,12 @@ import {getTraceIdsFromLogs, parseLimeResult, parseICEResult} from '../../util/d import JobModelsTable from '../../components/explanation/JobModelsTable'; import TemporalStability from '../../components/explanation/TemporalStability'; import {temporalPredictionListRequested, temporalLimePredictionListRequested} from '../../actions/PredictionAction'; -import VerticalBarChartCard from '../../components/chart/VerticalBarChartCard'; -import viz from '../../viz.svg'; -import AspectRatio from 'react-aspect-ratio'; +import ShapResult from '../../components/explanation/ShapResult'; +import ICEResult from '../../components/explanation/ICEResult'; +import SkaterResult from '../../components/explanation/SkaterResult'; +import FairMLResult from '../../components/explanation/FairMLResult'; +import {Row} from 'react-grid-system'; +import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; class Explanation extends Component { constructor(props) { @@ -108,7 +111,7 @@ class Explanation extends Component { render() { // eslint-disable-next-line max-len - const iceResult = parseICEResult([{'value': 'First outpatient consultation', 'label': 1.25, 'count': 48}, {'value': 'aspiration cytology behalf by p', 'label': 1.6666666666666667, 'count': 3}, {'value': 'assumption laboratory', 'label': 1.6923076923076923, 'count': 130}, {'value': 'compartment for inspection', 'label': 1.6666666666666667, 'count': 12}, {'value': 'ct abdomen', 'label': 2.0, 'count': 2}, {'value': 'cytology - abdominal tumor puncture', 'label': 1.0, 'count': 1}, {'value': 'cytology - ectocervix -', 'label': 1.32, 'count': 25}, {'value': 'cytology - vagina -', 'label': 1.2222222222222223, 'count': 9}, {'value': 'day care - all spec.beh.kind.-rev.', 'label': 1.0, 'count': 2}, {'value': 'demurrage - all spec.beh.kinderg.-Reval.', 'label': 1.7142857142857142, 'count': 28}, {'value': 'e.c.g. - Electrocardiography', 'label': 1.5, 'count': 22}, {'value': 'histological examination - biopsies nno', 'label': 1.3076923076923077, 'count': 13}, {'value': 'immuno-pathology', 'label': 1.25, 'count': 4}, {'value': 'inwend.geneesk. Out-year card costs', 'label': 2.0, 'count': 1}, {'value': 'inwend.geneesk. short-out card cost', 'label': 1.375, 'count': 8}, {'value': 'mammography chest wall', 'label': 1.3333333333333333, 'count': 3}, {'value': 'outpatient follow-up consultation', 'label': 1.087719298245614, 'count': 228}, {'value': 'telephone consultation', 'label': 1.0769230769230769, 'count': 13}, {'value': 'thorax', 'label': 1.375, 'count': 8}, {'value': 'treatment time - Unit t2 - megavolt', 'label': 1.0, 'count': 1}, {'value': 'treatment time - Unit t3 - megavolt', 'label': 1.0, 'count': 1}, {'value': 'ultrasound - internal genitals', 'label': 1.6333333333333333, 'count': 30}] + const iceResult = parseICEResult([{'label': 'First outpatient consultation', 'value': 1.25, 'count': 48}, {'label': 'aspiration cytology behalf by p', 'value': 1.6666666666666667, 'count': 3}, {'label': 'assumption laboratory', 'value': 1.6923076923076923, 'count': 130}, {'label': 'compartment for inspection', 'value': 1.6666666666666667, 'count': 12}, {'label': 'ct abdomen', 'value': 2.0, 'count': 2}, {'label': 'cytology - abdominal tumor puncture', 'value': 1.0, 'count': 1}, {'label': 'cytology - ectocervix -', 'value': 1.32, 'count': 25}, {'label': 'cytology - vagina -', 'value': 1.2222222222222223, 'count': 9}, {'label': 'day care - all spec.beh.kind.-rev.', 'value': 1.0, 'count': 2}, {'label': 'demurrage - all spec.beh.kinderg.-Reval.', 'value': 1.7142857142857142, 'count': 28}, {'label': 'e.c.g. - Electrocardiography', 'value': 1.5, 'count': 22}, {'label': 'histological examination - biopsies nno', 'value': 1.3076923076923077, 'count': 13}, {'label': 'immuno-pathology', 'value': 1.25, 'count': 4}, {'label': 'inwend.geneesk. Out-year card costs', 'value': 2.0, 'count': 1}, {'label': 'inwend.geneesk. short-out card cost', 'value': 1.375, 'count': 8}, {'label': 'mammography chest wall', 'value': 1.3333333333333333, 'count': 3}, {'label': 'outpatient follow-up consultation', 'value': 1.087719298245614, 'count': 228}, {'label': 'telephone consultation', 'value': 1.0769230769230769, 'count': 13}, {'label': 'thorax', 'value': 1.375, 'count': 8}, {'label': 'treatment time - Unit t2 - megavolt', 'value': 1.0, 'count': 1}, {'label': 'treatment time - Unit t3 - megavolt', 'value': 1.0, 'count': 1}, {'label': 'ultrasound - internal genitals', 'value': 1.6333333333333333, 'count': 30}] ); return (
    @@ -127,22 +130,7 @@ class Explanation extends Component { {/*
    */} -
    - - -
    -
    - - svg - - -
    +
    + + + + +
    + + + + + + + + +
    +
    + +
    ); } diff --git a/src/viz.svg b/src/viz.svg deleted file mode 100644 index 297d5336..00000000 --- a/src/viz.svg +++ /dev/null @@ -1,39004 +0,0 @@ - - -G - - -cluster_legend - - - -node8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf9 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node8->leaf9 - - - - - -leaf20 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node8->leaf20 - - - - - -node2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node2->node8 - - - - - -node29 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node2->leaf3 - - - - - -node39 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf40 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node39->leaf40 - - - - - -leaf41 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node39->leaf41 - - - - - -leaf42 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node38 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node38->node39 - - - - - -node38->leaf42 - - - - - -node36 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node36->node38 - - - - - -leaf37 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node36->leaf37 - - - - - -node34 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node34->node36 - - - - - -leaf35 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node34->leaf35 - - - - - -node32 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node32->node34 - - - - - -leaf33 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node32->leaf33 - - - - - -leaf43 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node31 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node31->node32 - - - - - -node44 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node31->leaf43 - - - - - -node48 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node51 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf49 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node48->leaf49 - - - - - -leaf50 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node48->leaf50 - - - - - -node52 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf53 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node52->leaf53 - - - - - -leaf54 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node52->leaf54 - - - - - -leaf55 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node51->node52 - - - - - -node51->leaf55 - - - - - -node47 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node47->node48 - - - - - -node47->node51 - - - - - -leaf56 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node46 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node46->node47 - - - - - -node46->leaf56 - - - - - -node44->node46 - - - - - -leaf45 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node44->leaf45 - - - - - -node30 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node30->node31 - - - - - -node30->node44 - - - - - -leaf57 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node29->node30 - - - - - -node29->leaf57 - - - - - -node1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node1->node2 - - - - - -node1->node29 - - - - - -node58 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node62 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node65 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf63 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node62->leaf63 - - - - - -leaf64 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node62->leaf64 - - - - - -leaf66 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node65->leaf66 - - - - - -leaf67 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node65->leaf67 - - - - - -node61 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node61->node62 - - - - - -node61->node65 - - - - - -node68 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node71 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf72 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node71->leaf72 - - - - - -leaf73 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node71->leaf73 - - - - - -node69 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node69->node71 - - - - - -node74 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf70 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node69->leaf70 - - - - - -node80 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf81 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node80->leaf81 - - - - - -leaf82 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node80->leaf82 - - - - - -node78 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node78->node80 - - - - - -node83 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf79 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node78->leaf79 - - - - - -node85 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf86 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node85->leaf86 - - - - - -leaf87 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node85->leaf87 - - - - - -node83->node85 - - - - - -leaf84 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node83->leaf84 - - - - - -node77 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node77->node78 - - - - - -node77->node83 - - - - - -leaf88 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node76 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node76->node77 - - - - - -node89 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node76->leaf88 - - - - - -node90 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node93 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf91 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node90->leaf91 - - - - - -leaf92 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node90->leaf92 - - - - - -node96 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf97 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node96->leaf97 - - - - - -leaf98 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node96->leaf98 - - - - - -node94 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node94->node96 - - - - - -leaf95 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node94->leaf95 - - - - - -leaf99 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node93->node94 - - - - - -node93->leaf99 - - - - - -node89->node90 - - - - - -node89->node93 - - - - - -node75 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node75->node76 - - - - - -node75->node89 - - - - - -leaf100 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node74->node75 - - - - - -node74->leaf100 - - - - - -node68->node69 - - - - - -node68->node74 - - - - - -node60 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node60->node61 - - - - - -node60->node68 - - - - - -node101 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node107 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf108 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node107->leaf108 - - - - - -leaf109 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node107->leaf109 - - - - - -node105 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node105->node107 - - - - - -node110 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf106 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node105->leaf106 - - - - - -node112 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf113 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node112->leaf113 - - - - - -leaf114 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node112->leaf114 - - - - - -node110->node112 - - - - - -leaf111 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node110->leaf111 - - - - - -node104 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node104->node105 - - - - - -node104->node110 - - - - - -node115 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node119 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf120 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node119->leaf120 - - - - - -leaf121 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node119->leaf121 - - - - - -leaf122 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node118 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node118->node119 - - - - - -node118->leaf122 - - - - - -node116 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node116->node118 - - - - - -node123 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf117 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node116->leaf117 - - - - - -leaf124 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node123->leaf124 - - - - - -leaf125 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node123->leaf125 - - - - - -node115->node116 - - - - - -node115->node123 - - - - - -node103 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node103->node104 - - - - - -node103->node115 - - - - - -node126 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node130 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node133 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf131 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node130->leaf131 - - - - - -leaf132 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node130->leaf132 - - - - - -node134 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf135 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node134->leaf135 - - - - - -leaf136 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node134->leaf136 - - - - - -leaf137 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node133->node134 - - - - - -node133->leaf137 - - - - - -node129 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node129->node130 - - - - - -node129->node133 - - - - - -node127 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node127->node129 - - - - - -node138 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf128 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node127->leaf128 - - - - - -node139 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node142 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf140 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node139->leaf140 - - - - - -leaf141 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node139->leaf141 - - - - - -node145 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf146 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node145->leaf146 - - - - - -leaf147 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node145->leaf147 - - - - - -node143 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node143->node145 - - - - - -leaf144 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node143->leaf144 - - - - - -leaf148 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node142->node143 - - - - - -node142->leaf148 - - - - - -node138->node139 - - - - - -node138->node142 - - - - - -node126->node127 - - - - - -node126->node138 - - - - - -node102 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node102->node103 - - - - - -node102->node126 - - - - - -node149 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node152 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf153 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node152->leaf153 - - - - - -leaf154 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node152->leaf154 - - - - - -node150 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node150->node152 - - - - - -leaf151 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node150->leaf151 - - - - - -leaf155 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node149->node150 - - - - - -node149->leaf155 - - - - - -node101->node102 - - - - - -node101->node149 - - - - - -node59 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node59->node60 - - - - - -node59->node101 - - - - - -node156 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node158 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node161 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf159 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node158->leaf159 - - - - - -leaf160 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node158->leaf160 - - - - - -node165 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf166 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node165->leaf166 - - - - - -leaf167 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node165->leaf167 - - - - - -node163 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node163->node165 - - - - - -leaf164 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node163->leaf164 - - - - - -leaf168 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node162 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node162->node163 - - - - - -node169 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node162->leaf168 - - - - - -leaf170 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node169->leaf170 - - - - - -leaf171 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node169->leaf171 - - - - - -node161->node162 - - - - - -node161->node169 - - - - - -node157 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node157->node158 - - - - - -node157->node161 - - - - - -node172 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node176 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf177 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node176->leaf177 - - - - - -leaf178 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node176->leaf178 - - - - - -leaf179 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node175 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node175->node176 - - - - - -node180 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node175->leaf179 - - - - - -node182 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf183 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node182->leaf183 - - - - - -leaf184 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node182->leaf184 - - - - - -node180->node182 - - - - - -leaf181 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node180->leaf181 - - - - - -node174 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node174->node175 - - - - - -node174->node180 - - - - - -node185 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node195 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node198 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf196 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node195->leaf196 - - - - - -leaf197 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node195->leaf197 - - - - - -node205 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf206 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node205->leaf206 - - - - - -leaf207 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node205->leaf207 - - - - - -node203 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node203->node205 - - - - - -leaf204 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node203->leaf204 - - - - - -leaf208 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node202 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node202->node203 - - - - - -node202->leaf208 - - - - - -node200 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node200->node202 - - - - - -leaf201 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node200->leaf201 - - - - - -node198->node200 - - - - - -leaf199 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node198->leaf199 - - - - - -node194 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node194->node195 - - - - - -node194->node198 - - - - - -leaf209 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node193 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node193->node194 - - - - - -node193->leaf209 - - - - - -node191 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node191->node193 - - - - - -leaf192 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node191->leaf192 - - - - - -leaf210 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node190 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node190->node191 - - - - - -node190->leaf210 - - - - - -node188 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node188->node190 - - - - - -leaf189 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node188->leaf189 - - - - - -node186 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node186->node188 - - - - - -node211 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf187 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node186->leaf187 - - - - - -leaf212 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node211->leaf212 - - - - - -leaf213 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node211->leaf213 - - - - - -node185->node186 - - - - - -node185->node211 - - - - - -node173 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node173->node174 - - - - - -node173->node185 - - - - - -node214 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node222 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf223 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node222->leaf223 - - - - - -leaf224 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node222->leaf224 - - - - - -node220 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node220->node222 - - - - - -leaf221 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node220->leaf221 - - - - - -leaf225 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node219 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node219->node220 - - - - - -node219->leaf225 - - - - - -node217 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node217->node219 - - - - - -node226 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf218 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node217->leaf218 - - - - - -node230 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf231 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node230->leaf231 - - - - - -leaf232 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node230->leaf232 - - - - - -node228 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node228->node230 - - - - - -leaf229 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node228->leaf229 - - - - - -node226->node228 - - - - - -leaf227 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node226->leaf227 - - - - - -node216 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node216->node217 - - - - - -node216->node226 - - - - - -node233 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node238 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf239 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node238->leaf239 - - - - - -leaf240 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node238->leaf240 - - - - - -leaf241 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node237 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node237->node238 - - - - - -node237->leaf241 - - - - - -node235 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node235->node237 - - - - - -leaf236 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node235->leaf236 - - - - - -leaf242 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node234 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node234->node235 - - - - - -node243 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node234->leaf242 - - - - - -node244 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf245 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node244->leaf245 - - - - - -leaf246 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node244->leaf246 - - - - - -leaf247 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node243->node244 - - - - - -node243->leaf247 - - - - - -node233->node234 - - - - - -node233->node243 - - - - - -node215 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node215->node216 - - - - - -node215->node233 - - - - - -node248 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node250 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -leaf251 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node250->leaf251 - - - - - -leaf252 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node250->leaf252 - - - - - -node248->node250 - - - - - -leaf249 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node248->leaf249 - - - - - -node214->node215 - - - - - -node214->node248 - - - - - -node172->node173 - - - - - -node172->node214 - - - - - -node156->node157 - - - - - -node156->node172 - - - - - -node58->node59 - - - - - -node58->node156 - - - - - -node0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -node0->node1 - - -< - - - -node0->node58 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -legend - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From c5807775e21abc7d3463d68e1b930cefbe03e4af Mon Sep 17 00:00:00 2001 From: Musacca Date: Thu, 19 Mar 2020 16:29:22 +0200 Subject: [PATCH 11/29] ICE and Decoded dataframe table is ready --- src/actions/JobActions.js | 8 + src/actions/ServerActions.js | 41 ++-- src/components/chart/VerticalBarChartCard.js | 2 +- src/components/explanation/DecodedDFTable.js | 94 +++++++++ src/components/explanation/ICEResult.js | 52 +++-- src/components/explanation/IceResultTable.js | 81 ++++++++ src/components/explanation/JobModelsTable.js | 2 +- src/components/explanation/ShapResult.js | 62 +++--- src/components/explanation/SkaterResult.js | 41 ++-- src/components/explanation/post_hoc.js | 8 +- src/middlewares/ServerMiddleware.js | 10 +- src/reducers/Explanation.js | 155 +++++++++++++++ src/reducers/Jobs.js | 35 +++- src/reducers/index.js | 4 +- src/util/dataReducers.js | 48 ++++- src/views/Explanation/Explanation.js | 197 +++++++++++++------ 16 files changed, 681 insertions(+), 159 deletions(-) create mode 100644 src/components/explanation/DecodedDFTable.js create mode 100644 src/components/explanation/IceResultTable.js diff --git a/src/actions/JobActions.js b/src/actions/JobActions.js index 0228fde0..2aaa0976 100644 --- a/src/actions/JobActions.js +++ b/src/actions/JobActions.js @@ -21,6 +21,14 @@ export const trainingSucceeded = createPayloadForwardingAction(TRAINING_SUCCEEDE export const TRAINING_FAILED = 'TRAINING_FAILED'; export const trainingFailed = createPayloadForwardingAction(TRAINING_FAILED); + +export const DECODING_REQUESTED = 'DECODING_REQUESTED'; +export const decodingRequested = createPayloadForwardingAction(DECODING_REQUESTED); +export const DECODING_RETRIEVED = 'DECODING_RETRIEVED'; +export const decodingtRetrieved = createPayloadForwardingAction(DECODING_RETRIEVED); +export const DECODING_FAILED = 'DECODING_FAILED'; +export const decodingFailed = createPayloadForwardingAction(DECODING_FAILED); + export const FILTER_SPLIT_CHANGED = 'FILTER_SPLIT_CHANGED'; export const PREDICTION_SPLIT_CHANGED = 'PREDICTION_SPLIT_CHANGED'; export const REPLAY_SPLIT_CHANGED = 'REPLAY_SPLIT_CHANGED'; diff --git a/src/actions/ServerActions.js b/src/actions/ServerActions.js index e473fec9..3e1b7fea 100644 --- a/src/actions/ServerActions.js +++ b/src/actions/ServerActions.js @@ -1,6 +1,6 @@ import {SERVER_URL} from '../constants'; import jsonAjax from '../JSONAjaxRequest'; -import {JOB_DELETED, jobsFailed, jobsRetrieved, trainingFailed, trainingSucceeded} from './JobActions'; +import {JOB_DELETED, jobsFailed, jobsRetrieved, trainingFailed, trainingSucceeded, decodingtRetrieved, decodingFailed} from './JobActions'; import {logInfoFailed, logInfoRetrieved, logListFailed, logListsRetrieved} from './LogActions'; import {traceListFailed, traceListRetrieved} from './TraceActions'; import {limeValueListFailed, limeValueListRetrieved} from './LimeActions'; @@ -9,6 +9,7 @@ import {modelsFailed, modelsRetrieved} from './ModelActions'; import {predictionFailed, predictionSucceeded, replayFailed, replaySucceeded} from './RuntimeActions'; import {temporalLimePredictionListRetrieved, temporalLimePredictionListFailed, temporalPredictionListRetrieved, temporalPredictionListFailed} from './PredictionAction'; +import { shapValueListRetrieved, shapValueListFailed, skaterValueListRetrieved, skaterValueListFailed, iceValueListRequested, iceValueListFailed, iceValueListRetrieved } from './ExplanationActions'; export const getJobs = () => (dispatch) => { jsonAjax( @@ -54,6 +55,18 @@ export const postTraining = (payload) => (dispatch) => { ); }; +export const getDecodingDf = ({id}) => (dispatch) => { + jsonAjax( + SERVER_URL + `/jobs/decode/${id}`, + 'GET', + null, + (resultList) => { + dispatch(decodingtRetrieved(resultList)); + }, + ({error}) => dispatch(decodingFailed(error)) + ); +}; + export const getSplits = () => (dispatch) => { jsonAjax( SERVER_URL + '/splits/', @@ -146,34 +159,34 @@ export const getShapValues = ({jobId, traceId}) => (dispatch) => { SERVER_URL + `/explanation/shap/${jobId}&${traceId}/`, 'GET', null, - (limeList) => { - dispatch(limeValueListRetrieved(limeList)); + (shapResult) => { + dispatch(shapValueListRetrieved(shapResult)); }, - ({error}) => dispatch(limeValueListFailed(error)) + ({error}) => dispatch(shapValueListFailed(error)) ); }; -export const getSkaterValues = ({jobId, traceId}) => (dispatch) => { +export const getSkaterValues = ({jobId}) => (dispatch) => { jsonAjax( - SERVER_URL + `/explanation/skater/${jobId}&${traceId}/`, + SERVER_URL + `/explanation/skater/${jobId}/`, 'GET', null, - (limeList) => { - dispatch(limeValueListRetrieved(limeList)); + (skaterResult) => { + dispatch(skaterValueListRetrieved(skaterResult)); }, - ({error}) => dispatch(limeValueListFailed(error)) + ({error}) => dispatch(skaterValueListFailed(error)) ); }; -export const getIceValues = ({jobId, traceId}) => (dispatch) => { +export const getIceValues = ({jobId, attribute}) => (dispatch) => { jsonAjax( - SERVER_URL + `/explanation/ice/${jobId}&${traceId}/`, + SERVER_URL + `/explanation/ice/${jobId}&${attribute}/`, 'GET', null, - (limeList) => { - dispatch(limeValueListRetrieved(limeList)); + (iceList) => { + dispatch(iceValueListRetrieved(iceList)); }, - ({error}) => dispatch(limeValueListFailed(error)) + ({error}) => dispatch(iceValueListFailed(error)) ); }; diff --git a/src/components/chart/VerticalBarChartCard.js b/src/components/chart/VerticalBarChartCard.js index 8fed5d7a..ce28b321 100644 --- a/src/components/chart/VerticalBarChartCard.js +++ b/src/components/chart/VerticalBarChartCard.js @@ -21,7 +21,7 @@ class HorizontalBarChartCard extends React.Component { bar: { horizontal: false, distributed: false, - columnWidth: '30%', + columnWidth: '10%', barHeight: '80%' } }, diff --git a/src/components/explanation/DecodedDFTable.js b/src/components/explanation/DecodedDFTable.js new file mode 100644 index 00000000..cfd8bd7d --- /dev/null +++ b/src/components/explanation/DecodedDFTable.js @@ -0,0 +1,94 @@ +import React, {PureComponent} from 'react'; +import {DataTable, TableBody, TableColumn, TableHeader, TablePagination, TableRow} from 'react-md/lib/DataTables/index'; +import PropTypes from 'prop-types'; +import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; +import CircularProgress from 'react-md/lib/Progress/CircularProgress'; + +class IceResultTable extends PureComponent { + constructor(props) { + super(props); + this.state = { + values: this.props.values.slice(0, 10), + }; + } + + handlePagination(start, rowsPerPage) { + this.setState({ + values: this.props.values.slice(start, start + rowsPerPage) + }); + } + + componentDidUpdate(prevProps) { + if (prevProps.values.length !== this.props.values.length) { + this.setState({values: this.props.values.slice(0, 10)}); + } + } + + getHeaderColumns(headers) { + return headers.map(header => { + let grow = false; + if (header === 'Configuration') { + grow = true; + } + return ( + + {' '} + {header} + + ); + }); + } + + getDecodedDFValuesTable(values) { + return ( + + + + {this.props.jobId != '' ? + 'Decoded dataframe result with job id: '+ this.props.jobId: ''} + + {!this.props.isDecodedValueLoaded ? : null} + + + + + {this.getHeaderColumns(this.props.headers)} + + + + {values.map( + (value, index) => ( + + {value.map( + (v) => ( + {v} + ) + )} + + ) + )} + + + + + + ); + } + render() { + return
    + {this.getDecodedDFValuesTable(this.state.values)} +
    ; + } +} + +IceResultTable.propTypes = { + values: PropTypes.array.isRequired, + headers: PropTypes.array.isRequired, + isDecodedValueLoaded: PropTypes.bool.isRequired, + jobId: PropTypes.any.isRequired, +}; + +export default IceResultTable; diff --git a/src/components/explanation/ICEResult.js b/src/components/explanation/ICEResult.js index e2b581b0..17c3cb75 100644 --- a/src/components/explanation/ICEResult.js +++ b/src/components/explanation/ICEResult.js @@ -3,6 +3,8 @@ import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; import PropTypes from 'prop-types'; import VerticalBarChartCard from '../../components/chart/VerticalBarChartCard'; import SelectField from 'react-md/lib/SelectFields'; +import CircularProgress from 'react-md/lib/Progress/CircularProgress'; +import IceResultTable from './IceResultTable'; class ShapResult extends PureComponent { constructor(props) { @@ -10,37 +12,57 @@ class ShapResult extends PureComponent { this.state = { }; } + onChangeFeature(value, _) { + this.props.onChangeFeature(value); + } getTraceSelector() { return ( ); } render() { return ( -
    -

    ICE result

    -
    -

    Select the prefix

    - {this.getTraceSelector()} -
    + + + +

    Select the feature

    + {this.getTraceSelector()} +
    + {!this.props.isIceValuesLoaded ? : null} + + {this.props.iceValueList.count.length != 0 ? + this.props.iceValueList.count.length < 70 ? + labels = {this.props.iceValueList.values} + count = {this.props.iceValueList.count} + data = {this.props.iceValueList.labels}> -
    + : + + + : null + } + + ); } } ShapResult.propTypes = { - iceResult: PropTypes.any, - jobId: PropTypes.any, + iceValueList: PropTypes.any, + jobId: PropTypes.any, + isIceValuesLoaded: PropTypes.bool, + selectedAttribute: PropTypes.any, + attributes: PropTypes.any, + onChangeFeature: PropTypes.func, + originalList: PropTypes.any }; export default ShapResult; diff --git a/src/components/explanation/IceResultTable.js b/src/components/explanation/IceResultTable.js new file mode 100644 index 00000000..ef82ffe1 --- /dev/null +++ b/src/components/explanation/IceResultTable.js @@ -0,0 +1,81 @@ +import React, {PureComponent} from 'react'; +import {DataTable, TableBody, TableColumn, TableHeader, TablePagination, TableRow} from 'react-md/lib/DataTables/index'; +import PropTypes from 'prop-types'; +import {getIceResultListTable} from '../../util/dataReducers'; + +class IceResultTable extends PureComponent { + constructor(props) { + super(props); + this.state = { + features: this.props.iceResultList.slice(0, 10), + }; + } + + handlePagination(start, rowsPerPage) { + this.setState({ + features: this.props.iceResultList.slice(start, start + rowsPerPage) + }); + } + + componentDidUpdate(prevProps) { + if (prevProps.iceResultList.length !== this.props.iceResultList.length) { + this.setState({features: this.props.iceResultList.slice(0, 10)}); + } + } + + getHeaderColumns(headers) { + return headers.map(header => { + let grow = false; + if (header === 'Configuration') { + grow = true; + } + return ( + + {' '} + {header} + + ); + }); + } + + getPrefixValuesTable(values) { + return ( + + + + {this.getHeaderColumns(['label', 'value', 'count'])} + + + + {values.map( + (value, index) => ( + + {value.map( + (v) => ( + {v} + ) + )} + + ) + )} + + + + ); + } + render() { + return
    + {this.getPrefixValuesTable(getIceResultListTable(this.state.features))} +
    ; + } +} + +IceResultTable.propTypes = { + iceResultList: PropTypes.array.isRequired, +}; + +export default IceResultTable; diff --git a/src/components/explanation/JobModelsTable.js b/src/components/explanation/JobModelsTable.js index aca356d9..b2ce77f1 100644 --- a/src/components/explanation/JobModelsTable.js +++ b/src/components/explanation/JobModelsTable.js @@ -23,7 +23,7 @@ const JobModelsTable = (props) => { - ); - } render() { return ( -
    - - - - svg - - - - -

    Select the trace composition

    - {this.getTraceSelector()} -
    - svg -
    -
    -
    + + + + { this.props.traceId != '' && this.props.jobId != '' ? + 'SHAP result with trace id: '+ this.props.traceId + +' and job id: '+ this.props.jobId: ''} + + + {!this.props.isShapValuesLoaded ? : null} + {JSON.stringify(this.props.shapValueList) !='{}'? + : null} + + ); } } ShapResult.propTypes = { - shapGeneralResult: PropTypes.any.isRequired, - shapSpecificTraceIdResult: PropTypes.any.isRequired, - shapSummaryPlotResult: PropTypes.any.isRequired, - traceId: PropTypes.any, - jobId: PropTypes.any, - traceIdList: PropTypes.any.isRequired, - shapSelectedTrace: PropTypes.string.isRequired + shapValueList: PropTypes.any.isRequired, + traceId: PropTypes.any, + jobId: PropTypes.any, + shapSelectedTrace: PropTypes.string.isRequired, + isShapValuesLoaded: PropTypes.bool.isRequired, }; export default ShapResult; diff --git a/src/components/explanation/SkaterResult.js b/src/components/explanation/SkaterResult.js index af84b411..4bf28559 100644 --- a/src/components/explanation/SkaterResult.js +++ b/src/components/explanation/SkaterResult.js @@ -3,6 +3,7 @@ import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; import PropTypes from 'prop-types'; import viz from '../../mock_data/viz.svg'; import InlineSVG from 'svg-inline-react'; +import CircularProgress from 'react-md/lib/Progress/CircularProgress'; class ShapResult extends PureComponent { constructor(props) { @@ -12,31 +13,35 @@ class ShapResult extends PureComponent { } render() { - const svgSource = `\n\nG\n\n\ncluster_legend\n\n\n\nnode2\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nleaf3\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nnode2->leaf3\n\n\n\n\n\nleaf4\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nnode2->leaf4\n\n\n\n\n\nleaf5\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\n\nnode1\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nnode1->node2\n\n\n\n\n\nnode1->leaf5\n\n\n\n\n\nleaf6\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\n\nnode0\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nnode0->node1\n\n\n<\n\n\n\nnode0->leaf6\n\n\n\n\n\n\n\nlegend\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n`; - return ( -
    -
    -

    Skater result

    - this.showSvgNewPage(svgSource)} style={{display: 'flex', justifyContent:'center', alignItems:'center'}} href preserveAspectRatio="xMidYMid slice" className="md-cell md-cell--12" alt="svg" src={svgSource} /> - + +
    +
    + + {!this.props.isSkaterValuesLoaded ? + : null} + + {JSON.stringify(this.props.skaterValueList) !='{}'? + this.showSvgNewPage(this.props.skaterValueList)} + style={{display: 'flex', justifyContent: 'center', alignItems: 'center'}} + href preserveAspectRatio="xMidYMid slice" + alt="svg" src={this.props.skaterValueList}/> + : null} + +
    -
    + ); } - - showSvgNewPage(svg){ - let v = window.open("") - v.document.write(svg) + showSvgNewPage(svg) { + let v = window.open(''); + v.document.write(svg); } } ShapResult.propTypes = { - shapGeneralResult: PropTypes.any.isRequired, - shapSpecificTraceIdResult: PropTypes.any.isRequired, - shapSummaryPlotResult: PropTypes.any.isRequired, + skaterValueList: PropTypes.any.isRequired, traceId: PropTypes.any, - jobId: PropTypes.any, - traceIdList: PropTypes.any.isRequired, - shapSelectedTrace: PropTypes.string.isRequired + isSkaterValuesLoaded: PropTypes.bool.isRequired }; export default ShapResult; diff --git a/src/components/explanation/post_hoc.js b/src/components/explanation/post_hoc.js index 586f1634..485d3a87 100644 --- a/src/components/explanation/post_hoc.js +++ b/src/components/explanation/post_hoc.js @@ -15,8 +15,9 @@ const PostHocExplanation = (props) => { return - {!props.isLimeValuesLoaded ? 'Lime result with trace id: '+ props.traceId +' is loading. Please wait...' : - 'Lime result with trace id: '+ props.traceId} + {props.traceId != '' && props.jobId != '' ? + 'Lime result with trace id: '+ props.traceId + +' and job id: '+ props.jobId: ''} {!props.isLimeValuesLoaded ? : null} @@ -32,7 +33,8 @@ PostHocExplanation.propTypes = { jobs: PropTypes.arrayOf(jobPropType).isRequired, limeValueList: PropTypes.any.isRequired, isLimeValuesLoaded: PropTypes.bool.isRequired, - traceId: PropTypes.any + traceId: PropTypes.any, + jobId: PropTypes.any }; export default PostHocExplanation; diff --git a/src/middlewares/ServerMiddleware.js b/src/middlewares/ServerMiddleware.js index 8de4272c..3c27e885 100644 --- a/src/middlewares/ServerMiddleware.js +++ b/src/middlewares/ServerMiddleware.js @@ -15,12 +15,14 @@ import { getPredictionTemporalStabilityValues, getShapValues, getIceValues, - getSkaterValues + getSkaterValues, + getDecodingDf } from '../actions/ServerActions'; -import {JOB_DELETE_REQUESTED, JOBS_REQUESTED, TRAINING_SUBMITTED} from '../actions/JobActions'; +import {JOB_DELETE_REQUESTED, JOBS_REQUESTED, TRAINING_SUBMITTED, DECODING_REQUESTED} from '../actions/JobActions'; import {TRACE_LIST_REQUESTED} from '../actions/TraceActions'; import {LOG_INFO_REQUESTED, LOG_LIST_REQUESTED} from '../actions/LogActions'; -import {LIME_VALUE_LIST_REQUESTED, SHAP_VALUE_LIST_REQUESTED, ICE_VALUE_LIST_REQUESTED, SKATER_VALUE_LIST_REQUESTED} from '../actions/ExplanationActions'; +import {LIME_VALUE_LIST_REQUESTED, SHAP_VALUE_LIST_REQUESTED, + ICE_VALUE_LIST_REQUESTED, SKATER_VALUE_LIST_REQUESTED} from '../actions/ExplanationActions'; import {SPLIT_SUBMITTED, SPLITS_REQUESTED} from '../actions/SplitActions'; import {MODELS_REQUESTED} from '../actions/ModelActions'; import {PREDICTION_SUBMITTED, REPLAY_SUBMITTED} from '../actions/RuntimeActions'; @@ -45,7 +47,7 @@ const ACTION_TYPE_TO_SERVER_ACTION = { [SKATER_VALUE_LIST_REQUESTED]: getSkaterValues, [TEMPORAL_STABILITY_LIME_PREDICTION_LIST_REQUESTED]: getLimeTemporalStabilityValues, [TEMPORAL_STABILITY_PREDICTION_LIST_REQUESTED]: getPredictionTemporalStabilityValues, - + [DECODING_REQUESTED]: getDecodingDf, }; const serverMiddleware = (store) => (next) => (action) => { diff --git a/src/reducers/Explanation.js b/src/reducers/Explanation.js index e69de29b..6c1d3270 100644 --- a/src/reducers/Explanation.js +++ b/src/reducers/Explanation.js @@ -0,0 +1,155 @@ +import { + LIME_VALUE_LIST_FAILED, + LIME_VALUE_LIST_REQUESTED, + LIME_VALUE_LIST_RETRIEVED, + + SHAP_VALUE_LIST_FAILED, + SHAP_VALUE_LIST_REQUESTED, + SHAP_VALUE_LIST_RETRIEVED, + + SKATER_VALUE_LIST_FAILED, + SKATER_VALUE_LIST_REQUESTED, + SKATER_VALUE_LIST_RETRIEVED, + + ICE_VALUE_LIST_FAILED, + ICE_VALUE_LIST_REQUESTED, + ICE_VALUE_LIST_RETRIEVED +} from '../actions/ExplanationActions'; + +const initialState = { + fetchState: {inFlight: false}, + limeValueList: {}, + shapValueList: {}, + iceValueList: {}, + skaterValueList: {}, + isLimeValuesLoaded: true, + isShapValuesLoaded: true, + isSkaterValuesLoaded: true, + isIceValuesLoaded: true, +}; + +const explanation = (state = initialState, action) => { + switch (action.type) { + case LIME_VALUE_LIST_REQUESTED: { + return { + ...state, + fetchState: {inFlight: true}, + isLimeValuesLoaded: false, + + }; + } + + case LIME_VALUE_LIST_RETRIEVED: { + const limeValueList = action.payload; + return { + ...state, + fetchState: {inFlight: false}, + limeValueList, + isLimeValuesLoaded: true + }; + } + + case LIME_VALUE_LIST_FAILED: { + const limeValueList = initialState.limeValueList; + return { + ...state, + fetchState: {inFlight: false, error: action.payload}, + limeValueList, + isLimeValuesLoaded: true + }; + } + + case SHAP_VALUE_LIST_REQUESTED: { + return { + ...state, + fetchState: {inFlight: true}, + isShapValuesLoaded: false, + + }; + } + + case SHAP_VALUE_LIST_RETRIEVED: { + const shapValueList = action.payload[1]; + return { + ...state, + fetchState: {inFlight: false}, + shapValueList, + isShapValuesLoaded: true + }; + } + + case SHAP_VALUE_LIST_FAILED: { + const shapValueList = initialState.shapValueList; + return { + ...state, + fetchState: {inFlight: false, error: action.payload}, + shapValueList, + isShapValuesLoaded: true + }; + } + + case SKATER_VALUE_LIST_REQUESTED: { + return { + ...state, + fetchState: {inFlight: true}, + isSkaterValuesLoaded: false, + + }; + } + + case SKATER_VALUE_LIST_RETRIEVED: { + const skaterValueList = action.payload[1]; + return { + ...state, + fetchState: {inFlight: false}, + skaterValueList, + isSkaterValuesLoaded: true + }; + } + + case SKATER_VALUE_LIST_FAILED: { + const skaterValueList = initialState.limeValueList; + return { + ...state, + fetchState: {inFlight: false, error: action.payload}, + skaterValueList, + isSkaterValuesLoaded: true + }; + } + + case ICE_VALUE_LIST_REQUESTED: { + return { + ...state, + fetchState: {inFlight: true}, + isIceValuesLoaded: false, + + }; + } + + case ICE_VALUE_LIST_RETRIEVED: { + const iceValueList = action.payload[1]; + return { + ...state, + fetchState: {inFlight: false}, + iceValueList, + isIceValuesLoaded: true + }; + } + + case ICE_VALUE_LIST_FAILED: { + const iceValueList = initialState.limeValueList; + return { + ...state, + fetchState: {inFlight: false, error: action.payload}, + iceValueList, + isIceValuesLoaded: true + }; + } + + default: + return state; + } + } +; + +export default explanation; diff --git a/src/reducers/Jobs.js b/src/reducers/Jobs.js index 0e6650b6..cc8102bc 100644 --- a/src/reducers/Jobs.js +++ b/src/reducers/Jobs.js @@ -15,7 +15,10 @@ import { JOBS_FAILED, JOBS_REQUESTED, JOBS_RETRIEVED, - TRACE_CHANGED + TRACE_CHANGED, + DECODING_REQUESTED, + DECODING_FAILED, + DECODING_RETRIEVED } from '../actions/JobActions'; import {JOB_RUN_CHANGED} from '../actions/RuntimeActions'; import { @@ -78,7 +81,11 @@ const initialState = { attributeNames: [], splitId: -100, filteredJobs: [], - selectedTrace: '' + selectedTrace: '', + jobsById: {}, + decodedDf: {}, + isDecodingLoaded: true + }; const initialFilters = { @@ -318,6 +325,30 @@ const jobs = (state = {...initialState, ...initialFilters}, action) => { }; } + case DECODING_REQUESTED: { + return { + ...state, + isDecodingLoaded: false, + decodedDf: {} + }; + } + + case DECODING_FAILED: { + return { + ...state, + isDecodingLoaded: true, + decodedDf: initialState.decodedDf + }; + } + case DECODING_RETRIEVED: { + const resultList = action.payload; + return { + ...state, + isDecodingLoaded: true, + decodedDf: resultList + }; + } + default: return state; } diff --git a/src/reducers/index.js b/src/reducers/index.js index 483d7c91..7fd44d6f 100644 --- a/src/reducers/index.js +++ b/src/reducers/index.js @@ -6,7 +6,7 @@ import training from './Training'; import splits from './Splits'; import models from './Models'; import traces from './Traces'; -import lime from './Lime'; +import explanation from './Explanation'; import predictions from './Predictions'; @@ -18,6 +18,6 @@ export default combineReducers({ training, splits, traces, - lime, + explanation, predictions }); diff --git a/src/util/dataReducers.js b/src/util/dataReducers.js index 670cc282..ae8d9060 100644 --- a/src/util/dataReducers.js +++ b/src/util/dataReducers.js @@ -275,7 +275,7 @@ export const parseLimeResult = (limeValueList) => { if (keys != null) { for (let j = 0; j < keys.length; j++) { if (limeValueList[keys[j]].length == 2) { - labels.push(limeValueList[keys[j]][0]); + labels.push(keys[j] +' = '+ limeValueList[keys[j]][0]); values.push(limeValueList[keys[j]][1]); } } @@ -289,7 +289,9 @@ export const parseICEResult = (iceResult) => { let count = []; for (let j = 0; j < iceResult.length; j++) { labels.push(iceResult[j].label); - values.push(iceResult[j].value - 1).toFixed(2); + if (isNaN(parseFloat(iceResult[j].value))) values.push(iceResult[j].value); + else values.push(iceResult[j].value).toFixed(2); + count.push(iceResult[j].count | 0); } return ({labels: labels, values: values, count: count}); @@ -316,10 +318,11 @@ export const parseTemporalStabilityLimeResultList = (predictionList, traceId) => data.pop(); for (let j = 0; j < prefixs.length; j++) { const prefixValues = traceAttr[prefixs[j]]; - for (let k = 1; k <= Object.keys(prefixValues).length; k++) { - const value = prefixValues['prefix_'+k]; - if (j == 0) data.push({name: 'prefix_'+k, data: []}); - data[k-1]['data'].push(value['importance']); + for (let k = 0; k <= Object.keys(prefixValues).length-1; k++) { + const value = prefixValues[Object.keys(prefixValues)[k]]; + console.log(Object.keys(prefixValues)[k]) + if (j == 0) data.push({name: (Object.keys(prefixValues)[k].concat(' = ', value['value'])), data: []}); + data[k]['data'].push(value['importance']); } } } @@ -395,3 +398,36 @@ const getTraceEventsHeader = (traceList) =>{ } return traceEventsHeaders; }; + + +export const getIceResultListTable = (iceResultList) =>{ + let i=0; + let result = []; + for (i = 0; i{ + let i=0; let j=0; + let result = []; + let keys = Object.keys(dfResult); + if (keys.length>0) { + for (j = 0; j < dfResult[keys[0]].length; j++) { + let arr = []; + arr.push(j+1); + + for (i = 0; i job.id==id)[0]; + } render() { // eslint-disable-next-line max-len - const iceResult = parseICEResult([{'label': 'First outpatient consultation', 'value': 1.25, 'count': 48}, {'label': 'aspiration cytology behalf by p', 'value': 1.6666666666666667, 'count': 3}, {'label': 'assumption laboratory', 'value': 1.6923076923076923, 'count': 130}, {'label': 'compartment for inspection', 'value': 1.6666666666666667, 'count': 12}, {'label': 'ct abdomen', 'value': 2.0, 'count': 2}, {'label': 'cytology - abdominal tumor puncture', 'value': 1.0, 'count': 1}, {'label': 'cytology - ectocervix -', 'value': 1.32, 'count': 25}, {'label': 'cytology - vagina -', 'value': 1.2222222222222223, 'count': 9}, {'label': 'day care - all spec.beh.kind.-rev.', 'value': 1.0, 'count': 2}, {'label': 'demurrage - all spec.beh.kinderg.-Reval.', 'value': 1.7142857142857142, 'count': 28}, {'label': 'e.c.g. - Electrocardiography', 'value': 1.5, 'count': 22}, {'label': 'histological examination - biopsies nno', 'value': 1.3076923076923077, 'count': 13}, {'label': 'immuno-pathology', 'value': 1.25, 'count': 4}, {'label': 'inwend.geneesk. Out-year card costs', 'value': 2.0, 'count': 1}, {'label': 'inwend.geneesk. short-out card cost', 'value': 1.375, 'count': 8}, {'label': 'mammography chest wall', 'value': 1.3333333333333333, 'count': 3}, {'label': 'outpatient follow-up consultation', 'value': 1.087719298245614, 'count': 228}, {'label': 'telephone consultation', 'value': 1.0769230769230769, 'count': 13}, {'label': 'thorax', 'value': 1.375, 'count': 8}, {'label': 'treatment time - Unit t2 - megavolt', 'value': 1.0, 'count': 1}, {'label': 'treatment time - Unit t3 - megavolt', 'value': 1.0, 'count': 1}, {'label': 'ultrasound - internal genitals', 'value': 1.6333333333333333, 'count': 30}] - ); + // const iceResult = parseICEResult([{'label': 'First outpatient consultation', 'value': 1.25, 'count': 48}, {'label': 'aspiration cytology behalf by p', 'value': 1.6666666666666667, 'count': 3}, {'label': 'assumption laboratory', 'value': 1.6923076923076923, 'count': 130}, {'label': 'compartment for inspection', 'value': 1.6666666666666667, 'count': 12}, {'label': 'ct abdomen', 'value': 2.0, 'count': 2}, {'label': 'cytology - abdominal tumor puncture', 'value': 1.0, 'count': 1}, {'label': 'cytology - ectocervix -', 'value': 1.32, 'count': 25}, {'label': 'cytology - vagina -', 'value': 1.2222222222222223, 'count': 9}, {'label': 'day care - all spec.beh.kind.-rev.', 'value': 1.0, 'count': 2}, {'label': 'demurrage - all spec.beh.kinderg.-Reval.', 'value': 1.7142857142857142, 'count': 28}, {'label': 'e.c.g. - Electrocardiography', 'value': 1.5, 'count': 22}, {'label': 'histological examination - biopsies nno', 'value': 1.3076923076923077, 'count': 13}, {'label': 'immuno-pathology', 'value': 1.25, 'count': 4}, {'label': 'inwend.geneesk. Out-year card costs', 'value': 2.0, 'count': 1}, {'label': 'inwend.geneesk. short-out card cost', 'value': 1.375, 'count': 8}, {'label': 'mammography chest wall', 'value': 1.3333333333333333, 'count': 3}, {'label': 'outpatient follow-up consultation', 'value': 1.087719298245614, 'count': 228}, {'label': 'telephone consultation', 'value': 1.0769230769230769, 'count': 13}, {'label': 'thorax', 'value': 1.375, 'count': 8}, {'label': 'treatment time - Unit t2 - megavolt', 'value': 1.0, 'count': 1}, {'label': 'treatment time - Unit t3 - megavolt', 'value': 1.0, 'count': 1}, {'label': 'ultrasound - internal genitals', 'value': 1.6333333333333333, 'count': 30}] + // ); + let decodedDfTableResult = getDecodedDFTable(this.props.decodedDf); return (
    @@ -130,7 +153,30 @@ class Explanation extends Component { {/*
    */} - +
    + +
    +
    + +
    +
    + +
    - -
    -
    - + +
    + +
    +
    + +
    +
    - +
    + jobs = {this.props.jobs} + iceValueList = {parseICEResult(this.props.iceValueList)} + originalList = {this.props.iceValueList} + isIceValuesLoaded = {this.props.isIceValuesLoaded} + selectedAttribute={this.props.selectedAttribute} + attributes ={this.filterJobsById(this.props.jobId) != undefined ? + this.filterJobsById(this.props.jobId).config.encoding.features: []} + onChangeFeature = {this.onChangeFeature.bind(this)} + > - -
    - - - - - - - - -
    -
    - -
    +
    ); } @@ -193,6 +240,7 @@ Explanation.propTypes = { onRequestLogList: PropTypes.func.isRequired, onRequestSplitList: PropTypes.func.isRequired, onRequestJobs: PropTypes.func.isRequired, + onRequestDecoding: PropTypes.func.isRequired, onSplitChange: PropTypes.func.isRequired, onMethodChange: PropTypes.func.isRequired, onTraceChange: PropTypes.func.isRequired, @@ -200,8 +248,17 @@ Explanation.propTypes = { onRequestTraces: PropTypes.func.isRequired, onJobChange: PropTypes.func.isRequired, onRequestLimeValues: PropTypes.func.isRequired, + onRequestSkaterValues: PropTypes.func.isRequired, + onRequestShapValues: PropTypes.func.isRequired, + onRequestIceValues: PropTypes.func.isRequired, onRequestPredictionTemporalList: PropTypes.func.isRequired, onRequestLimeTemporalList: PropTypes.func.isRequired, + onRequestFailLimeValues: PropTypes.func.isRequired, + onRequestFailLimeTemporalList: PropTypes.func.isRequired, + onRequestFailPredictionTemporalList: PropTypes.func.isRequired, + onRequestFailShapValues: PropTypes.func.isRequired, + onRequestFailSkaterValues: PropTypes.func.isRequired, + onRequestFailIceValues: PropTypes.func.isRequired, filterOptionChange: PropTypes.func.isRequired, labelTypeChange: PropTypes.func.isRequired, jobs: PropTypes.arrayOf(jobPropType).isRequired, @@ -222,16 +279,25 @@ Explanation.propTypes = { }).isRequired, clickedJobId: PropTypes.number, limeValueList: PropTypes.any, + shapValueList: PropTypes.any, + iceValueList: PropTypes.any, + skaterValueList: PropTypes.any, traceList: PropTypes.any, logs: PropTypes.any, splits: PropTypes.any, jobsById: PropTypes.any, selectedTrace: PropTypes.any, + selectedAttribute: PropTypes.any, filteredJobs: PropTypes.any, + decodedDf: PropTypes.any, jobId: PropTypes.number.isRequired, isLimeTempStabilityLoaded: PropTypes.bool.isRequired, isPredictionTempStabilityLoaded: PropTypes.bool.isRequired, isLimeValuesLoaded: PropTypes.bool.isRequired, + isShapValuesLoaded: PropTypes.bool.isRequired, + isSkaterValuesLoaded: PropTypes.bool.isRequired, + isIceValuesLoaded: PropTypes.bool.isRequired, + isDecodedValueLoaded: PropTypes.bool.isRequired, limeTempStabilityList: PropTypes.any, predictionTempStabilityList: PropTypes.any }; @@ -241,11 +307,19 @@ const mapStateToProps = (state) => ({ splitLabels: splitsToLabel(state.logs.byId, state.splits.byId, state.jobs.uniqueSplits), fetchState: state.jobs.fetchState, filteredJobs: state.jobs.filteredJobs, + decodedDf: state.jobs.decodedDf, + isDecodedValueLoaded: state.jobs.isDecodingLoaded, logs: state.logs.byId, splits: state.splits.byId, splitId: state.jobs.splitId, - limeValueList: state.lime.limeValueList, - isLimeValuesLoaded: state.lime.isLimeValuesLoaded, + limeValueList: state.explanation.limeValueList, + isLimeValuesLoaded: state.explanation.isLimeValuesLoaded, + shapValueList: state.explanation.shapValueList, + isShapValuesLoaded: state.explanation.isShapValuesLoaded, + iceValueList: state.explanation.iceValueList, + isIceValuesLoaded: state.explanation.isIceValuesLoaded, + skaterValueList: state.explanation.skaterValueList, + isSkaterValuesLoaded: state.explanation.isSkaterValuesLoaded, traceList: state.traces.byId, predictionMethod: state.jobs.predictionMethod, prefixLengths: state.jobs.prefixLengths.sort((a, b) => (a - b)), @@ -253,6 +327,7 @@ const mapStateToProps = (state) => ({ jobsById: state.jobs.byId, jobId: state.jobs.predictionJobId, selectedTrace: state.jobs.selectedTrace, + selectedAttribute: state.explanation.selectedAttribute, limeTempStabilityList: state.predictions.limeTempStabilityList, predictionTempStabilityList: state.predictions.predictionTempStabilityList, isLimeTempStabilityLoaded: state.predictions.isLimeTempStabilityLoaded, @@ -278,11 +353,23 @@ const mapDispatchToProps = (dispatch) => ({ onRequestSplitList: () => dispatch(splitsRequested()), onRequestJobs: () => dispatch(jobsRequested()), onRequestTraces: (id) => dispatch(traceListRequested({id})), + onRequestDecoding: (id) => dispatch(decodingRequested({id})), onRequestLimeValues: (jobId, traceId) => dispatch(limeValueListRequested({jobId, traceId})), + onRequestShapValues: (jobId, traceId) => dispatch(shapValueListRequested({jobId, traceId})), + onRequestIceValues: (jobId, attribute) => dispatch(iceValueListRequested({jobId, attribute})), + onRequestSkaterValues: (jobId) => dispatch(skaterValueListRequested({jobId})), onRequestPredictionTemporalList: (jobId, traceId) => dispatch(temporalPredictionListRequested({jobId, traceId})), onRequestLimeTemporalList: (jobId, traceId) => dispatch(temporalLimePredictionListRequested({jobId, traceId})), + onRequestFailLimeValues: () => dispatch(limeValueListFailed(null)), + onRequestFailShapValues: () => dispatch(shapValueListFailed(null)), + onRequestFailIceValues: () => dispatch(iceValueListFailed(null)), + onRequestFailSkaterValues: () => dispatch(skaterValueListFailed(null)), + onRequestFailPredictionTemporalList: ()=> + dispatch(temporalPredictionListFailed(null)), + onRequestFailLimeTemporalList: () => + dispatch(temporalLimePredictionListFailed(null)), filterOptionChange: (_, event) => dispatch({ type: FILTER_OPTION_CHANGED, payload: {name: event.target.name, value: event.target.value} From 54a0994dcc293bc1b77f193bfb4f1cd2979a8e79 Mon Sep 17 00:00:00 2001 From: Musacca Date: Mon, 23 Mar 2020 17:53:53 +0200 Subject: [PATCH 12/29] Tests SHAP, ICE and Skater developed --- .../components/chart/ScatterChart.test.js | 24 + .../chart/VerticalBarChartCard.test.js | 40 + .../explanation/DecodedDFTable.test.js | 42 + .../components/explanation/ICEResult.test.js | 48 + .../explanation/ICEResultTable.test.js | 24 + .../components/explanation/ShapResult.test.js | 32 + .../explanation/SkaterResult.test.js | 28 + .../explanation/TemporalStability.test.js | 38 + .../components/explanation/post_hoc.test.js | 2 +- src/actions/ServerActions.js | 6 +- src/components/chart/DecisionTree.js | 98 -- src/components/chart/PredictionLineChart.js | 13 +- src/components/chart/R3DecisionTree.js | 72 -- src/components/explanation/DecodedDFTable.js | 10 +- src/components/explanation/FairMLResult.js | 55 - src/components/explanation/ShapResult.js | 1 - src/components/explanation/SkaterResult.js | 1 - .../explanation/TemporalStability.js | 3 +- src/components/explanation/ante_hoc.js | 50 - src/mock_data/Template.js | 7 - src/mock_data/dependence_plot.png | Bin 26054 -> 0 bytes src/mock_data/explainer.html | 32 - src/mock_data/scratch.png | Bin 18776 -> 0 bytes src/mock_data/test.txt | 1128 ----------------- src/mock_data/viz.svg | 1 - src/util/dataReducers.js | 3 +- src/views/Explanation/Explanation.js | 2 +- stories/Explanation.js | 72 ++ 28 files changed, 368 insertions(+), 1464 deletions(-) create mode 100644 src/__tests__/components/chart/ScatterChart.test.js create mode 100644 src/__tests__/components/chart/VerticalBarChartCard.test.js create mode 100644 src/__tests__/components/explanation/DecodedDFTable.test.js create mode 100644 src/__tests__/components/explanation/ICEResult.test.js create mode 100644 src/__tests__/components/explanation/ICEResultTable.test.js create mode 100644 src/__tests__/components/explanation/ShapResult.test.js create mode 100644 src/__tests__/components/explanation/SkaterResult.test.js create mode 100644 src/__tests__/components/explanation/TemporalStability.test.js delete mode 100644 src/components/chart/DecisionTree.js delete mode 100644 src/components/chart/R3DecisionTree.js delete mode 100644 src/components/explanation/FairMLResult.js delete mode 100644 src/components/explanation/ante_hoc.js delete mode 100644 src/mock_data/Template.js delete mode 100644 src/mock_data/dependence_plot.png delete mode 100644 src/mock_data/explainer.html delete mode 100644 src/mock_data/scratch.png delete mode 100644 src/mock_data/test.txt delete mode 100644 src/mock_data/viz.svg diff --git a/src/__tests__/components/chart/ScatterChart.test.js b/src/__tests__/components/chart/ScatterChart.test.js new file mode 100644 index 00000000..190279d4 --- /dev/null +++ b/src/__tests__/components/chart/ScatterChart.test.js @@ -0,0 +1,24 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import ScatterChartCard from '../../../components/chart/ScatterChartCard'; +import {parseTemporalStabilityPredictionResultList} +from '../../../util/dataReducers'; +import {temporalStabilityResult} from '../../../../stories/Explanation'; +import ReactApexChart from 'react-apexcharts'; + +const temporalStabilityPredictionResult = +parseTemporalStabilityPredictionResultList(temporalStabilityResult, '2_3301'); + +it('renders', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(ReactApexChart).length).toBe(1); + const chartProps = element.find(ReactApexChart).props(); + expect(chartProps.series[0].data.length).toBe(temporalStabilityPredictionResult.length); +}); + +it('no data', () => { + const element = shallow(); + expect(element.find(ReactApexChart).length).toBe(0); +}); + diff --git a/src/__tests__/components/chart/VerticalBarChartCard.test.js b/src/__tests__/components/chart/VerticalBarChartCard.test.js new file mode 100644 index 00000000..d7043a80 --- /dev/null +++ b/src/__tests__/components/chart/VerticalBarChartCard.test.js @@ -0,0 +1,40 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import ReactApexChart from 'react-apexcharts'; +import VerticalBarChartCard from '../../../components/chart/VerticalBarChartCard'; + +const labels = ['event', 'event1', 'event2', 'event3', 'event4']; +const data = [1, 0.8, 0.1, 0.3, 0]; +const count = [1, 2, 1, 3, 9]; + + +describe('VerticalBarChartCard', () => { + it('renders with empty data', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(ReactApexChart).length).toBe(0); + }); + + it('renders with empty labels', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(ReactApexChart).length).toBe(1); + + const chartProps = element.find(ReactApexChart).props(); + expect(chartProps.options.xaxis.categories.length).toBe(0); + expect(chartProps.series[0].data.length).toBe(count.length); + expect(chartProps.series[1].data.length).toBe(data.length); + expect(chartProps.options.xaxis.categories.length).toBe(0); + }); + + it('renders with non empty data and label', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(ReactApexChart).length).toBe(1); + + const chartProps = element.find(ReactApexChart).props(); + expect(chartProps.options.xaxis.categories.length).toBe(labels.length); + expect(chartProps.series[0].data.length).toBe(count.length); + expect(chartProps.series[1].data.length).toBe(data.length); + }); +}); diff --git a/src/__tests__/components/explanation/DecodedDFTable.test.js b/src/__tests__/components/explanation/DecodedDFTable.test.js new file mode 100644 index 00000000..d7d55baa --- /dev/null +++ b/src/__tests__/components/explanation/DecodedDFTable.test.js @@ -0,0 +1,42 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import DecodedDFTable from '../../../components/explanation/DecodedDFTable'; +import {getDecodedDFTable} from '../../../util/dataReducers'; +import {DataTable, TableBody, TableColumn, TableHeader, TablePagination, TableRow} from 'react-md/lib/DataTables/index'; +import {decodedDFResultList} from '../../../../stories/Explanation'; +import CircularProgress from 'react-md/lib/Progress/CircularProgress'; + + +const decodedDFResult = getDecodedDFTable(decodedDFResultList); + +describe('Dedocded DF Table', () => { + it('renders', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(DataTable).length).toBe(1); + expect(element.find(CircularProgress).length).toBe(0); + expect(element.find(DataTable).at(0).find(TableRow).length).toBe(decodedDFResult.data.length+1); + expect(element.find(DataTable).at(0).find(TableHeader).find(TableRow).length).toBe(1); + expect(element.find(DataTable).at(0).find(TableBody).find(TableRow).length).toBe(decodedDFResult.data.length); + expect(element.find(DataTable).at(0).find(TableHeader) + .find(TableColumn).length).toBe(decodedDFResult.headers.length); + expect(element.find(TablePagination).length).toBe(1); + }); + + it('no element', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(DataTable).length).toBe(0); + expect(element.find(TablePagination).length).toBe(0); + expect(element.find(TableRow).length).toBe(0); + expect(element.find(CircularProgress).length).toBe(1); + }); +}); diff --git a/src/__tests__/components/explanation/ICEResult.test.js b/src/__tests__/components/explanation/ICEResult.test.js new file mode 100644 index 00000000..ca998aa6 --- /dev/null +++ b/src/__tests__/components/explanation/ICEResult.test.js @@ -0,0 +1,48 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import ICEResult from '../../../components/explanation/ICEResult'; +import IceResultTable from '../../../components/explanation/IceResultTable'; +import CircularProgress from 'react-md/lib/Progress/CircularProgress'; +import VerticalBarChartCard from '../../../components/chart/VerticalBarChartCard'; +import {parseICEResult} from '../../../util/dataReducers'; +import {iceResultList} from '../../../../stories/Explanation'; +import SelectField from 'react-md/lib/SelectFields'; + +const iceResult = parseICEResult(iceResultList); + +describe('ICE result', () => { + it('All data loaded', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(SelectField).length).toBe(1); + expect(element.find(SelectField).at(0).props().menuItems.length).toBe(2); + + expect(element.find(VerticalBarChartCard).length).toBe(1); + expect(element.find(IceResultTable).length).toBe(0); + + expect(element.find(CircularProgress).length).toBe(0); + }); + + it('None of the data loaded', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(SelectField).length).toBe(1); + expect(element.find(SelectField).at(0).props().menuItems.length).toBe(2); + expect(element.find(VerticalBarChartCard).length).toBe(1); + expect(element.find(IceResultTable).length).toBe(0); + expect(element.find(CircularProgress).length).toBe(1); + }); +}); diff --git a/src/__tests__/components/explanation/ICEResultTable.test.js b/src/__tests__/components/explanation/ICEResultTable.test.js new file mode 100644 index 00000000..1d217413 --- /dev/null +++ b/src/__tests__/components/explanation/ICEResultTable.test.js @@ -0,0 +1,24 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import IceResultTable from '../../../components/explanation/IceResultTable'; +import {getIceResultListTable} from '../../../util/dataReducers'; +import {DataTable, TableBody, TableColumn, TableHeader, TablePagination, TableRow} from 'react-md/lib/DataTables/index'; +import {iceResultList} from '../../../../stories/Explanation'; + + +const iceResult = getIceResultListTable(iceResultList); + +describe('Ice result Table', () => { + it('renders', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(DataTable).length).toBe(1); + expect(element.find(DataTable).at(0).find(TableRow).length).toBe(iceResult.length+1); + expect(element.find(DataTable).at(0).find(TableHeader).find(TableRow).length).toBe(1); + expect(element.find(DataTable).at(0).find(TableBody).find(TableRow).length).toBe(iceResult.length); + expect(element.find(DataTable).at(0).find(TableHeader) + .find(TableColumn).length).toBe(3); + expect(element.find(TablePagination).length).toBe(1); + }); +}); diff --git a/src/__tests__/components/explanation/ShapResult.test.js b/src/__tests__/components/explanation/ShapResult.test.js new file mode 100644 index 00000000..c7554426 --- /dev/null +++ b/src/__tests__/components/explanation/ShapResult.test.js @@ -0,0 +1,32 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import ShapResult from '../../../components/explanation/ShapResult'; +import {shapResult} from '../../../../stories/Explanation'; +import InlineSVG from 'svg-inline-react'; +import CircularProgress from 'react-md/lib/Progress/CircularProgress'; + +describe('Shap result', () => { + it('renders with data', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(InlineSVG).length).toBe(1); + expect(element.find(CircularProgress).length).toBe(0); + }); + + it('renders without data', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(InlineSVG).length).toBe(0); + expect(element.find(CircularProgress).length).toBe(1); + }); +}); diff --git a/src/__tests__/components/explanation/SkaterResult.test.js b/src/__tests__/components/explanation/SkaterResult.test.js new file mode 100644 index 00000000..37de0065 --- /dev/null +++ b/src/__tests__/components/explanation/SkaterResult.test.js @@ -0,0 +1,28 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import SkaterResult from '../../../components/explanation/SkaterResult'; +import {skaterResult} from '../../../../stories/Explanation'; +import InlineSVG from 'svg-inline-react'; +import CircularProgress from 'react-md/lib/Progress/CircularProgress'; + +describe('Skater result', () => { + it('renders with data', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(InlineSVG).length).toBe(1); + expect(element.find(CircularProgress).length).toBe(0); + }); + + it('renders without data', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(InlineSVG).length).toBe(0); + expect(element.find(CircularProgress).length).toBe(1); + }); +}); diff --git a/src/__tests__/components/explanation/TemporalStability.test.js b/src/__tests__/components/explanation/TemporalStability.test.js new file mode 100644 index 00000000..ca653e2d --- /dev/null +++ b/src/__tests__/components/explanation/TemporalStability.test.js @@ -0,0 +1,38 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import TemporalStability from '../../../components/explanation/TemporalStability'; +import {limeTemporalStabilityResult, temporalStabilityResult} from '../../../../stories/Explanation'; +import CircularProgress from 'react-md/lib/Progress/CircularProgress'; +import PredictionLineChart from '../../../components/chart/PredictionLineChart'; +import ScatterChartCard from '../../../components/chart/ScatterChartCard'; + + +describe('Temporal stability', () => { + it('All data loaded', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(PredictionLineChart).length).toBe(1); + expect(element.find(ScatterChartCard).length).toBe(1); + expect(element.find(CircularProgress).length).toBe(0); + }); + + it('None of the data loaded', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(PredictionLineChart).length).toBe(1); + expect(element.find(ScatterChartCard).length).toBe(1); + expect(element.find(CircularProgress).length).toBe(2); + }); +}); diff --git a/src/__tests__/components/explanation/post_hoc.test.js b/src/__tests__/components/explanation/post_hoc.test.js index 137c0494..0f112aaa 100644 --- a/src/__tests__/components/explanation/post_hoc.test.js +++ b/src/__tests__/components/explanation/post_hoc.test.js @@ -5,7 +5,7 @@ import HorizontalBarChartCard from '../../../components/chart/HorizontalBarChart import {parseLimeResult} from '../../../util/dataReducers'; import {limeList} from '../../../../stories/Explanation'; -describe('TraceTable', () => { +describe('Lime result', () => { it('renders without data', () => { const element = shallow( (dispatch) => { jsonAjax( diff --git a/src/components/chart/DecisionTree.js b/src/components/chart/DecisionTree.js deleted file mode 100644 index 9b66def1..00000000 --- a/src/components/chart/DecisionTree.js +++ /dev/null @@ -1,98 +0,0 @@ -/* eslint-disable max-len */ -import React from 'react'; -import {Graphviz} from 'graphviz-react'; -class DecisionTree extends React.Component { - constructor(props) { - super(props); - } - render() { - return prefix_1 ≤ 23.5
    gini = 0.5
    samples = 100.0%
    value = [0.5, 0.5]
    class = prefix_2>]; - 1 [fillcolor=cornsilk, label=prefix_2 ≤ 30.5
    gini = 0.38
    samples = 64.8%
    value = [0.255, 0.745]
    class = prefix_2>]; - 0 -> 1 [color=steelblue, headlabel="True", labelangle=45, labeldistance="2.5"]; - 2 [fillcolor=cornsilk, label=prefix_2 ≤ 3.5
    gini = 0.123
    samples = 53.9%
    value = [0.066, 0.934]
    class = prefix_2>]; - 1 -> 2 [color=steelblue]; - 3 [fillcolor=coral, label=gini = 0.0
    samples = 0.4%
    value = [1.0, 0.0]
    class = prefix_1>]; - 2 -> 3 [color=steelblue]; - 4 [fillcolor=cornsilk, label=prefix_1 ≤ 12.5
    gini = 0.099
    samples = 53.5%
    value = [0.052, 0.948]
    class = prefix_2>]; - 2 -> 4 [color=steelblue]; - 5 [fillcolor=lightsteelblue, label=gini = 0.0
    samples = 28.5%
    value = [0.0, 1.0]
    class = prefix_2>]; - 4 -> 5 [color=steelblue]; - 6 [fillcolor=cornsilk, label=prefix_2 ≤ 9.0
    gini = 0.193
    samples = 25.0%
    value = [0.108, 0.892]
    class = prefix_2>]; - 4 -> 6 [color=steelblue]; - 7 [fillcolor=lightsteelblue, label=gini = -0.0
    samples = 20.2%
    value = [0.0, 1.0]
    class = prefix_2>]; - 6 -> 7 [color=steelblue]; - 8 [fillcolor=cornsilk, label=prefix_1 ≤ 20.0
    gini = 0.498
    samples = 4.7%
    value = [0.472, 0.528]
    class = prefix_2>]; - 6 -> 8 [color=steelblue]; - 9 [fillcolor=coral, label=gini = 0.305
    samples = 2.2%
    value = [0.812, 0.188]
    class = prefix_1>]; - 8 -> 9 [color=steelblue]; - 12 [fillcolor=lightsteelblue, label=gini = 0.0
    samples = 2.5%
    value = [0.0, 1.0]
    class = prefix_2>]; - 8 -> 12 [color=steelblue]; - 13 [fillcolor=cornsilk, label=prefix_1 ≤ 11.5
    gini = 0.261
    samples = 10.9%
    value = [0.846, 0.154]
    class = prefix_1>]; - 1 -> 13 [color=steelblue]; - 14 [fillcolor=cornsilk, label=prefix_2 ≤ 35.5
    gini = 0.498
    samples = 3.1%
    value = [0.467, 0.533]
    class = prefix_2>]; - 13 -> 14 [color=steelblue]; - 15 [fillcolor=coral, label=gini = 0.0
    samples = 0.4%
    value = [1.0, 0.0]
    class = prefix_1>]; - 14 -> 15 [color=steelblue]; - 16 [fillcolor=cornsilk, label=prefix_1 ≤ 5.5
    gini = 0.44
    samples = 2.6%
    value = [0.327, 0.673]
    class = prefix_2>]; - 14 -> 16 [color=steelblue]; - 17 [fillcolor=coral, label=gini = 0.411
    samples = 0.8%
    value = [0.711, 0.289]
    class = prefix_1>]; - 16 -> 17 [color=steelblue]; - 20 [fillcolor=cornsilk, label=prefix_2 ≤ 44.5
    gini = 0.186
    samples = 1.9%
    value = [0.104, 0.896]
    class = prefix_2>]; - 16 -> 20 [color=steelblue]; - 21 [fillcolor=lightsteelblue, label=gini = 0.0
    samples = 1.8%
    value = [0.0, 1.0]
    class = prefix_2>]; - 20 -> 21 [color=steelblue]; - 22 [fillcolor=coral, label=gini = 0.0
    samples = 0.1%
    value = [1.0, 0.0]
    class = prefix_1>]; - 20 -> 22 [color=steelblue]; - 23 [fillcolor=cornsilk, label=prefix_1 ≤ 19.5
    gini = 0.091
    samples = 7.8%
    value = [0.952, 0.048]
    class = prefix_1>]; - 13 -> 23 [color=steelblue]; - 24 [fillcolor=coral, label=gini = 0.0
    samples = 7.2%
    value = [1.0, 0.0]
    class = prefix_1>]; - 23 -> 24 [color=steelblue]; - 25 [fillcolor=lightsteelblue, label=gini = 0.0
    samples = 0.7%
    value = [0.0, 1.0]
    class = prefix_2>]; - 23 -> 25 [color=steelblue]; - 26 [fillcolor=cornsilk, label=prefix_2 ≤ 7.0
    gini = 0.297
    samples = 35.2%
    value = [0.819, 0.181]
    class = prefix_1>]; - 0 -> 26 [color=steelblue, headlabel="False", labelangle="-45", labeldistance="2.5"]; - 27 [fillcolor=cornsilk, label=prefix_2 ≤ 3.5
    gini = 0.124
    samples = 3.0%
    value = [0.066, 0.934]
    class = prefix_2>]; - 26 -> 27 [color=steelblue]; - 28 [fillcolor=coral, label=gini = 0.0
    samples = 0.1%
    value = [1.0, 0.0]
    class = prefix_1>]; - 27 -> 28 [color=steelblue]; - 29 [fillcolor=lightsteelblue, label=gini = 0.0
    samples = 2.9%
    value = [0.0, 1.0]
    class = prefix_2>]; - 27 -> 29 [color=steelblue]; - 30 [fillcolor=cornsilk, label=prefix_2 ≤ 42.5
    gini = 0.238
    samples = 32.2%
    value = [0.862, 0.138]
    class = prefix_1>]; - 26 -> 30 [color=steelblue]; - 31 [fillcolor=cornsilk, label=prefix_1 ≤ 24.5
    gini = 0.179
    samples = 29.8%
    value = [0.9, 0.1]
    class = prefix_1>]; - 30 -> 31 [color=steelblue]; - 32 [fillcolor=coral, label=gini = 0.0
    samples = 13.2%
    value = [1.0, 0.0]
    class = prefix_1>]; - 31 -> 32 [color=steelblue]; - 33 [fillcolor=cornsilk, label=prefix_2 ≤ 23.5
    gini = 0.31
    samples = 16.6%
    value = [0.808, 0.192]
    class = prefix_1>]; - 31 -> 33 [color=steelblue]; - 34 [fillcolor=cornsilk, label=prefix_2 ≤ 11.5
    gini = 0.07
    samples = 11.9%
    value = [0.964, 0.036]
    class = prefix_1>]; - 33 -> 34 [color=steelblue]; - 35 [fillcolor=coral, label=gini = 0.0
    samples = 9.5%
    value = [1.0, 0.0]
    class = prefix_1>]; - 34 -> 35 [color=steelblue]; - 36 [fillcolor=cornsilk, label=prefix_2 ≤ 15.5
    gini = 0.322
    samples = 2.4%
    value = [0.799, 0.201]
    class = prefix_1>]; - 34 -> 36 [color=steelblue]; - 37 [fillcolor=lightsteelblue, label=gini = 0.0
    samples = 0.8%
    value = [0.0, 1.0]
    class = prefix_2>]; - 36 -> 37 [color=steelblue]; - 38 [fillcolor=coral, label=gini = -0.0
    samples = 1.7%
    value = [1.0, 0.0]
    class = prefix_1>]; - 36 -> 38 [color=steelblue]; - 39 [fillcolor=cornsilk, label=prefix_2 ≤ 38.5
    gini = 0.268
    samples = 4.7%
    value = [0.159, 0.841]
    class = prefix_2>]; - 33 -> 39 [color=steelblue]; - 40 [fillcolor=lightsteelblue, label=gini = 0.0
    samples = 4.3%
    value = [0.0, 1.0]
    class = prefix_2>]; - 39 -> 40 [color=steelblue]; - 41 [fillcolor=coral, label=gini = 0.0
    samples = 0.4%
    value = [1.0, 0.0]
    class = prefix_1>]; - 39 -> 41 [color=steelblue]; - 42 [fillcolor=cornsilk, label=prefix_2 ≤ 45.0
    gini = 0.149
    samples = 2.4%
    value = [0.081, 0.919]
    class = prefix_2>]; - 30 -> 42 [color=steelblue]; - 43 [fillcolor=lightsteelblue, label=gini = 0.0
    samples = 2.3%
    value = [0.0, 1.0]
    class = prefix_2>]; - 42 -> 43 [color=steelblue]; - 44 [fillcolor=coral, label=gini = -0.0
    samples = 0.1%
    value = [1.0, 0.0]
    class = prefix_1>]; - 42 -> 44 [color=steelblue]; - }`} /> - ; - } -} - -export default DecisionTree; diff --git a/src/components/chart/PredictionLineChart.js b/src/components/chart/PredictionLineChart.js index 5e1f7768..e1c3cdd5 100644 --- a/src/components/chart/PredictionLineChart.js +++ b/src/components/chart/PredictionLineChart.js @@ -36,16 +36,13 @@ class PredictionLineChart extends React.Component { max: this.props.data.length +1, tickAmount: this.props.data.length +1, title: { - text: 'Time' + text: 'Feature' } }, yaxis: { title: { - text: 'Prediction' + text: 'Importance' }, - min: -1, - max: 2, - tickAmount: 3, axisBorder: { show: true, color: '#000000', @@ -59,13 +56,13 @@ class PredictionLineChart extends React.Component { } }, legend: { - position: 'top', + position: 'bottom', horizontalAlign: 'right', - floating: true, + floating: false, } }, }; - const height = '350em'; + const height = '450em'; const chart = ( - -
    - ); -} -} -export default R3DecisionTree; - diff --git a/src/components/explanation/DecodedDFTable.js b/src/components/explanation/DecodedDFTable.js index cfd8bd7d..135a726a 100644 --- a/src/components/explanation/DecodedDFTable.js +++ b/src/components/explanation/DecodedDFTable.js @@ -4,7 +4,7 @@ import PropTypes from 'prop-types'; import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; import CircularProgress from 'react-md/lib/Progress/CircularProgress'; -class IceResultTable extends PureComponent { +class DecodedDFTable extends PureComponent { constructor(props) { super(props); this.state = { @@ -49,6 +49,7 @@ class IceResultTable extends PureComponent {
    {!this.props.isDecodedValueLoaded ? : null} + {this.props.values.length>0 ? @@ -72,7 +73,8 @@ class IceResultTable extends PureComponent { rows={this.props.values.length} rowsPerPageLabel={'Rows per page'} onPagination={this.handlePagination.bind(this)}/> - + : null + }
    ); @@ -84,11 +86,11 @@ class IceResultTable extends PureComponent { } } -IceResultTable.propTypes = { +DecodedDFTable.propTypes = { values: PropTypes.array.isRequired, headers: PropTypes.array.isRequired, isDecodedValueLoaded: PropTypes.bool.isRequired, jobId: PropTypes.any.isRequired, }; -export default IceResultTable; +export default DecodedDFTable; diff --git a/src/components/explanation/FairMLResult.js b/src/components/explanation/FairMLResult.js deleted file mode 100644 index ac4c2dba..00000000 --- a/src/components/explanation/FairMLResult.js +++ /dev/null @@ -1,55 +0,0 @@ -import React, {PureComponent} from 'react'; -import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; -import PropTypes from 'prop-types'; -import SelectField from 'react-md/lib/SelectFields'; -import HorizontalBarChartCard from '../../components/chart/HorizontalBarChartCard'; -import {parseFairMLResult} from '../../util/dataReducers'; - -class ShapResult extends PureComponent { - constructor(props) { - super(props); - this.state = { - }; - } - getTraceSelector() { - return ( - - ); - } - - render() { - const fairMLResult = parseFairMLResult([{'label': 'Age_1', 'value': 0.5}, - {'label': 'CType_1', 'value': 0.5}, - {'label': 'ClType_1', 'value': 0.5}, - {'label': 'ClaimValue_1', 'value': 0.5}, - {'label': 'PClaims_1', 'value': 0.5}, - {'label': 'lifecycle:transition_1', 'value': 0.5}, - {'label': 'org:resource_1', 'value': 0.5}]); - const horizontalBarChart = ; - return ( -
    -

    FairML result

    -
    -

    Select the prefix

    - {this.getTraceSelector()} -
    -
    {horizontalBarChart}
    - -
    - ); - } -} -ShapResult.propTypes = { - iceResult: PropTypes.any, - jobId: PropTypes.any, -}; -export default ShapResult; diff --git a/src/components/explanation/ShapResult.js b/src/components/explanation/ShapResult.js index 12c8ad0f..7ae3bb7f 100644 --- a/src/components/explanation/ShapResult.js +++ b/src/components/explanation/ShapResult.js @@ -1,7 +1,6 @@ import React, {PureComponent} from 'react'; import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; import PropTypes from 'prop-types'; -import SelectField from 'react-md/lib/SelectFields'; import InlineSVG from 'svg-inline-react'; import CircularProgress from 'react-md/lib/Progress/CircularProgress'; diff --git a/src/components/explanation/SkaterResult.js b/src/components/explanation/SkaterResult.js index 4bf28559..a5294183 100644 --- a/src/components/explanation/SkaterResult.js +++ b/src/components/explanation/SkaterResult.js @@ -1,7 +1,6 @@ import React, {PureComponent} from 'react'; import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; import PropTypes from 'prop-types'; -import viz from '../../mock_data/viz.svg'; import InlineSVG from 'svg-inline-react'; import CircularProgress from 'react-md/lib/Progress/CircularProgress'; diff --git a/src/components/explanation/TemporalStability.js b/src/components/explanation/TemporalStability.js index c543446b..2302fcaf 100644 --- a/src/components/explanation/TemporalStability.js +++ b/src/components/explanation/TemporalStability.js @@ -13,8 +13,7 @@ const TemporalStability = (props) => { parseTemporalStabilityLimeResultList(props.limeTemporalChartData, props.traceId); const temporalStabilityPredictionResult = parseTemporalStabilityPredictionResultList(props.predictionTemportalChartData, props.traceId); - - return
    + return
    diff --git a/src/components/explanation/ante_hoc.js b/src/components/explanation/ante_hoc.js deleted file mode 100644 index 4848889d..00000000 --- a/src/components/explanation/ante_hoc.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Created by Williams.Rizzi on 9/9/19. - */ -import React from 'react'; -import {Card, CardText, CardTitle} from 'react-md/lib/Cards/index'; -import PropTypes from 'prop-types'; -import FetchState from './../FetchState'; -import {fetchStatePropType, jobPropType, selectLabelProptype} from '../../propTypes'; - -const AnteHocExplanation = (props) => { - // const selectChange = (value, _) => { - // props.splitChange(value); - // }; - - return - - -

    asdf

    - -
    -
    ; -}; - - -AnteHocExplanation.propTypes = { - jobs: PropTypes.arrayOf(jobPropType).isRequired, - splitLabels: selectLabelProptype, - fetchState: fetchStatePropType, - methodChange: PropTypes.func.isRequired, - splitChange: PropTypes.func.isRequired, - prefixLengths: PropTypes.arrayOf(PropTypes.string).isRequired, - prefixChange: PropTypes.func.isRequired, - selectedPrefixes: PropTypes.arrayOf(PropTypes.number).isRequired, - selectedSplitId: PropTypes.number.isRequired, - filterOptionChange: PropTypes.func.isRequired, - labelChange: PropTypes.func.isRequired, - filterOptions: PropTypes.shape({ - encodings: PropTypes.arrayOf(PropTypes.string).isRequired, - clusterings: PropTypes.arrayOf(PropTypes.string).isRequired, - classification: PropTypes.arrayOf(PropTypes.string).isRequired, - regression: PropTypes.arrayOf(PropTypes.string).isRequired, - timeSeriesPrediction: PropTypes.arrayOf(PropTypes.string).isRequired, - labelling: PropTypes.any.isRequired, - attributeNames: PropTypes.arrayOf(PropTypes.string).isRequired, - thresholds: PropTypes.arrayOf(PropTypes.number).isRequired, - padding: PropTypes.string.isRequired - }).isRequired, - predictionMethod: PropTypes.string.isRequired -}; -export default AnteHocExplanation; diff --git a/src/mock_data/Template.js b/src/mock_data/Template.js deleted file mode 100644 index 025a5960..00000000 --- a/src/mock_data/Template.js +++ /dev/null @@ -1,7 +0,0 @@ -import React from 'react'; -let Template = React.createReactClass({ - render: function () { - return (
    Mi HTML
    ); - } -}); -module.exports = Template; diff --git a/src/mock_data/dependence_plot.png b/src/mock_data/dependence_plot.png deleted file mode 100644 index 83c4717d1f0fdfcf994b829208c346d82b38e6bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26054 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 E3r2MPOaK4? diff --git a/src/mock_data/explainer.html b/src/mock_data/explainer.html deleted file mode 100644 index 5a0c5557..00000000 --- a/src/mock_data/explainer.html +++ /dev/null @@ -1,32 +0,0 @@ - - -
    -
    - Visualization omitted, Javascript library not loaded!
    - Have you run `initjs()` in this notebook? If this notebook was from another - user you must also trust this notebook (File -> Trust notebook). If you are viewing - this notebook on github the Javascript has been stripped for security. If you are using - JupyterLab this error is because a JupyterLab extension has not yet been written. -
    - diff --git a/src/mock_data/scratch.png b/src/mock_data/scratch.png deleted file mode 100644 index 06a73538b28df2a5ad28cce7bebda162ea8b687c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18776 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
      n@83Y?Vhi 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 D_DB1f diff --git a/src/mock_data/test.txt b/src/mock_data/test.txt deleted file mode 100644 index f8deee10..00000000 --- a/src/mock_data/test.txt +++ /dev/null @@ -1,1128 +0,0 @@ - "\n", - "\n", - "G\n", - "\n", - "\n", - "cluster_legend\n", - "\n", - "\n", - "\n", - "node2\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "leaf3\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "node2->leaf3\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "leaf4\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "node2->leaf4\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "leaf5\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "node1\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "node1->node2\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "node1->leaf5\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "leaf6\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "node0\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "node0->node1\n", - "\n", - "\n", - "<\n", - "\n", - "\n", - "\n", - "node0->leaf6\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "legend\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - "" \ No newline at end of file diff --git a/src/mock_data/viz.svg b/src/mock_data/viz.svg deleted file mode 100644 index f906151f..00000000 --- a/src/mock_data/viz.svg +++ /dev/null @@ -1 +0,0 @@ -\n\nG\n\n\ncluster_legend\n\n\n\nnode2\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nleaf3\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nnode2->leaf3\n\n\n\n\n\nleaf4\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nnode2->leaf4\n\n\n\n\n\nleaf5\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\n\nnode1\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nnode1->node2\n\n\n\n\n\nnode1->leaf5\n\n\n\n\n\nleaf6\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\n\nnode0\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\nnode0->node1\n\n\n<\n\n\n\nnode0->leaf6\n\n\n\n\n\n\n\nlegend\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n \ No newline at end of file diff --git a/src/util/dataReducers.js b/src/util/dataReducers.js index ae8d9060..9b78541a 100644 --- a/src/util/dataReducers.js +++ b/src/util/dataReducers.js @@ -312,6 +312,7 @@ export const parseFairMLResult = (iceResult) => { export const parseTemporalStabilityLimeResultList = (predictionList, traceId) => { let data = [[]]; let prefixs = []; + if (predictionList[traceId] != null || predictionList[traceId] != undefined) { const traceAttr = predictionList[traceId]; prefixs = Object.keys(traceAttr); @@ -320,7 +321,6 @@ export const parseTemporalStabilityLimeResultList = (predictionList, traceId) => const prefixValues = traceAttr[prefixs[j]]; for (let k = 0; k <= Object.keys(prefixValues).length-1; k++) { const value = prefixValues[Object.keys(prefixValues)[k]]; - console.log(Object.keys(prefixValues)[k]) if (j == 0) data.push({name: (Object.keys(prefixValues)[k].concat(' = ', value['value'])), data: []}); data[k]['data'].push(value['importance']); } @@ -410,6 +410,7 @@ export const getIceResultListTable = (iceResultList) =>{ arr.push(iceResultList[i]['count']); result.push(arr); } + return result; }; diff --git a/src/views/Explanation/Explanation.js b/src/views/Explanation/Explanation.js index b65a9ff6..1b4c8c36 100644 --- a/src/views/Explanation/Explanation.js +++ b/src/views/Explanation/Explanation.js @@ -32,7 +32,7 @@ import TraceExplanation from '../../components/explanation/TraceExplanation'; import {getTraceIdsFromLogs, parseLimeResult, parseICEResult, getDecodedDFTable} from '../../util/dataReducers'; import JobModelsTable from '../../components/explanation/JobModelsTable'; import TemporalStability from '../../components/explanation/TemporalStability'; -import {temporalPredictionListRequested, temporalLimePredictionListRequested, +import {temporalPredictionListRequested, temporalLimePredictionListRequested, temporalLimePredictionListFailed, temporalPredictionListFailed} from '../../actions/PredictionAction'; import ShapResult from '../../components/explanation/ShapResult'; import ICEResult from '../../components/explanation/ICEResult'; diff --git a/stories/Explanation.js b/stories/Explanation.js index 3b60fb9b..34533e33 100644 --- a/stories/Explanation.js +++ b/stories/Explanation.js @@ -75,3 +75,75 @@ export const traceList = [{ } ] }]; + +export const decodedDFResultList = { + 'prefix_1': [ + 'Register', + 'Register', + 'Register'], + 'prefix_2': [ + 'Register', + 'Register', + 'Register'], + 'org:resource_1': [ + 'PR3', + 'PR3', + 'PR3'] +}; + +export const iceResultList = [ + 'False', + [ + { + 'value': '12.0', + 'label': 1.0000, + 'count': 1 + }, + { + 'value': '16.0', + 'label': 1.0000, + 'count': 1 + }, + { + 'value': '18.0', + 'label': 2.0000, + 'count': 1 + }, + ] +]; + +export const shapResult = [ + 'False', + '' +]; + +export const skaterResult = [ + 'False', + '' +]; + +export const limeTemporalStabilityResult = { + '2_3301': { + 'prefix_1': { + 'prefix_2': { + 'value': 'High Insurance Check', + 'importance': -35642.4310 + }, + 'prefix_1': { + 'value': 'Register', + 'importance': 0.0000 + } + } + } +}; + +export const temporalStabilityResult = { + '2_3301': { + 'prefix_1': { + 'value': 'Register', + 'predicted': 0 + } + } +}; + + From f2645cddc349d525d7ae30a7abea61e6a930d54f Mon Sep 17 00:00:00 2001 From: Musacca Date: Sat, 4 Apr 2020 12:11:46 +0300 Subject: [PATCH 13/29] small design bug fix --- src/views/Explanation/Explanation.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/views/Explanation/Explanation.js b/src/views/Explanation/Explanation.js index 1b4c8c36..523fe04f 100644 --- a/src/views/Explanation/Explanation.js +++ b/src/views/Explanation/Explanation.js @@ -14,7 +14,8 @@ import { jobsRequested, TRACE_CHANGED, PREDICTION_JOB_CHANGED, - decodingRequested + decodingRequested, + decodingFailed } from '../../actions/JobActions'; import {fetchStatePropType, jobPropType, selectLabelProptype} from '../../propTypes'; import {mapJobs, splitsToLabel} from '../../util/unNormalize'; @@ -66,6 +67,7 @@ class Explanation extends Component { this.props.onRequestFailShapValues(null, null); this.props.onRequestFailSkaterValues(null); this.props.onRequestFailIceValues(null, null); + this.props.onRequestFailDecodeDF(null); } onChangeTrace(trace) { @@ -94,7 +96,7 @@ class Explanation extends Component { } this.props.onRequestSkaterValues(id); this.props.onRequestDecoding(id); - this.props.onRequestFailIceValues(); + this.props.onRequestIceValues(this.props.jobId, this.props.selectedAttribute); } componentDidMount() { @@ -259,6 +261,7 @@ Explanation.propTypes = { onRequestFailShapValues: PropTypes.func.isRequired, onRequestFailSkaterValues: PropTypes.func.isRequired, onRequestFailIceValues: PropTypes.func.isRequired, + onRequestFailDecodeDF: PropTypes.func.isRequired, filterOptionChange: PropTypes.func.isRequired, labelTypeChange: PropTypes.func.isRequired, jobs: PropTypes.arrayOf(jobPropType).isRequired, @@ -370,6 +373,8 @@ const mapDispatchToProps = (dispatch) => ({ dispatch(temporalPredictionListFailed(null)), onRequestFailLimeTemporalList: () => dispatch(temporalLimePredictionListFailed(null)), + onRequestFailDecodeDF: () => + dispatch(decodingFailed(null)), filterOptionChange: (_, event) => dispatch({ type: FILTER_OPTION_CHANGED, payload: {name: event.target.name, value: event.target.value} From addbb4b92b65efecca235fb4de4d4512604809c2 Mon Sep 17 00:00:00 2001 From: Musacca Date: Sat, 4 Apr 2020 12:15:45 +0300 Subject: [PATCH 14/29] Update Explanation.js --- src/views/Explanation/Explanation.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/views/Explanation/Explanation.js b/src/views/Explanation/Explanation.js index 1b4c8c36..06b28bcb 100644 --- a/src/views/Explanation/Explanation.js +++ b/src/views/Explanation/Explanation.js @@ -1,6 +1,3 @@ -/** - * Created by Williams.Rizzi on 9/9/19. - */ import React, {Component} from 'react'; import {connect} from 'react-redux'; import PropTypes from 'prop-types'; @@ -14,7 +11,8 @@ import { jobsRequested, TRACE_CHANGED, PREDICTION_JOB_CHANGED, - decodingRequested + decodingRequested, + decodingFailed } from '../../actions/JobActions'; import {fetchStatePropType, jobPropType, selectLabelProptype} from '../../propTypes'; import {mapJobs, splitsToLabel} from '../../util/unNormalize'; @@ -66,6 +64,7 @@ class Explanation extends Component { this.props.onRequestFailShapValues(null, null); this.props.onRequestFailSkaterValues(null); this.props.onRequestFailIceValues(null, null); + this.props.onRequestFailDecodeDF(null); } onChangeTrace(trace) { @@ -94,7 +93,7 @@ class Explanation extends Component { } this.props.onRequestSkaterValues(id); this.props.onRequestDecoding(id); - this.props.onRequestFailIceValues(); + this.props.onRequestIceValues(this.props.jobId, this.props.selectedAttribute); } componentDidMount() { @@ -259,6 +258,7 @@ Explanation.propTypes = { onRequestFailShapValues: PropTypes.func.isRequired, onRequestFailSkaterValues: PropTypes.func.isRequired, onRequestFailIceValues: PropTypes.func.isRequired, + onRequestFailDecodeDF: PropTypes.func.isRequired, filterOptionChange: PropTypes.func.isRequired, labelTypeChange: PropTypes.func.isRequired, jobs: PropTypes.arrayOf(jobPropType).isRequired, @@ -370,6 +370,8 @@ const mapDispatchToProps = (dispatch) => ({ dispatch(temporalPredictionListFailed(null)), onRequestFailLimeTemporalList: () => dispatch(temporalLimePredictionListFailed(null)), + onRequestFailDecodeDF: () => + dispatch(decodingFailed(null)), filterOptionChange: (_, event) => dispatch({ type: FILTER_OPTION_CHANGED, payload: {name: event.target.name, value: event.target.value} From 9f3ca1efee2d8d8bfc9e184bd1bc4d8d157477b6 Mon Sep 17 00:00:00 2001 From: Musacca Date: Mon, 6 Apr 2020 13:47:48 +0300 Subject: [PATCH 15/29] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index fbacda4a..36867c03 100644 --- a/README.md +++ b/README.md @@ -62,3 +62,5 @@ This project was bootstrapped with [Create React App](https://github.com/faceboo - [@fmmaggi](https://github.com/fmmaggi) Fabrizio Maggi - [@WilliamsRizzi](https://github.com/WilliamsRizzi) Williams Rizzi - [@HitLuca](https://github.com/HitLuca) Luca Simonetto +- [@Musacca](https://github.com/Musacca) Musabir Musabayli + From fda6e515d2ed0473f16784520c7e1a6909bc421d Mon Sep 17 00:00:00 2001 From: Musacca Date: Wed, 8 Apr 2020 18:15:25 +0300 Subject: [PATCH 16/29] show explanation page in main page --- src/components/WalkThrough.js | 4 ++-- src/containers/Full/Full.js | 5 ++--- src/views/Explanation/Explanation.js | 3 --- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/components/WalkThrough.js b/src/components/WalkThrough.js index 9b1a2750..8acab5ec 100644 --- a/src/components/WalkThrough.js +++ b/src/components/WalkThrough.js @@ -120,14 +120,14 @@ class WalkThrough extends PureComponent { {/* text="Create continuous predictions for a stream of events"*/} {/* threeLines*/} {/* />*/} - {/* 8} button={} title="Explanation" text="Explanation" threeLines - /> */} + /> }
    diff --git a/src/containers/Full/Full.js b/src/containers/Full/Full.js index d58f648b..d6f6df92 100644 --- a/src/containers/Full/Full.js +++ b/src/containers/Full/Full.js @@ -93,15 +93,14 @@ class Full extends Component { active: isActive('/validation', pathname), primaryText: 'Validation', leftIcon: insert_chart, - }, - /* - { + }, { component: Link, to: '/explanation', active: isActive('/explanation', pathname), primaryText: 'explanation', leftIcon: work, }, + /* , { component: Link, diff --git a/src/views/Explanation/Explanation.js b/src/views/Explanation/Explanation.js index 523fe04f..06b28bcb 100644 --- a/src/views/Explanation/Explanation.js +++ b/src/views/Explanation/Explanation.js @@ -1,6 +1,3 @@ -/** - * Created by Williams.Rizzi on 9/9/19. - */ import React, {Component} from 'react'; import {connect} from 'react-redux'; import PropTypes from 'prop-types'; From cc7929617f86153fc5d5296e30ad09078db7e1e7 Mon Sep 17 00:00:00 2001 From: Musacca Date: Sun, 12 Apr 2020 14:54:43 +0300 Subject: [PATCH 17/29] CfFeedback --- .vscode/launch.json | 20 ++ src/actions/ExplanationActions.js | 16 ++ src/actions/JobActions.js | 7 + src/actions/ServerActions.js | 40 ++- src/components/explanation/CfFeedback.js | 244 ++++++++++++++++++ .../explanation/CfFeedbackResultTable.js | 51 ++++ src/components/explanation/ICEResult.js | 6 +- .../explanation/RetrainResultTable.js | 50 ++++ src/components/explanation/post_hoc.js | 2 +- src/middlewares/ServerMiddleware.js | 13 +- src/reducers/Explanation.js | 72 +++++- src/reducers/Jobs.js | 33 ++- src/util/dataReducers.js | 36 +++ src/views/Explanation/Explanation.js | 147 ++++++++--- 14 files changed, 684 insertions(+), 53 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 src/components/explanation/CfFeedback.js create mode 100644 src/components/explanation/CfFeedbackResultTable.js create mode 100644 src/components/explanation/RetrainResultTable.js diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..389a6188 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Launch Program", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}\\start", + "outFiles": [ + "${workspaceFolder}/**/*.js" + ] + } + ] +} \ No newline at end of file diff --git a/src/actions/ExplanationActions.js b/src/actions/ExplanationActions.js index 79e48023..dcbdb2d6 100644 --- a/src/actions/ExplanationActions.js +++ b/src/actions/ExplanationActions.js @@ -26,3 +26,19 @@ export const SKATER_VALUE_LIST_RETRIEVED = 'SKATER_VALUE_LIST_RETRIEVED'; export const skaterValueListRetrieved = createPayloadForwardingAction(SKATER_VALUE_LIST_RETRIEVED); export const SKATER_VALUE_LIST_FAILED = 'SKATER_VALUE_LIST_FAILED'; export const skaterValueListFailed = createPayloadForwardingAction(SKATER_VALUE_LIST_FAILED); + + +export const CFFEEDBACK_VALUE_LIST_REQUESTED = 'CFFEEFBACK_VALUE_LIST_REQUESTED'; +export const cffeedbackValueListRequested = createPayloadForwardingAction(CFFEEDBACK_VALUE_LIST_REQUESTED); +export const CFFEEFBACK_VALUE_LIST_RETRIEVED = 'CFFEEFBACK_VALUE_LIST_RETRIEVED'; +export const cffeedbackValueListRetrieved = createPayloadForwardingAction(CFFEEFBACK_VALUE_LIST_RETRIEVED); +export const CFFEEFBACK_VALUE_LIST_FAILED = 'CFFEEFBACK_VALUE_LIST_FAILED'; +export const cffeedbackValueListFailed = createPayloadForwardingAction(CFFEEFBACK_VALUE_LIST_FAILED); + + +export const RETRAIN_VALUE_LIST_REQUESTED = 'RETRAIN_VALUE_LIST_REQUESTED'; +export const retrainValueListRequested = createPayloadForwardingAction(RETRAIN_VALUE_LIST_REQUESTED); +export const RETRAIN_VALUE_LIST_RETRIEVED = 'RETRAIN_VALUE_LIST_RETRIEVED'; +export const retrainValueListRetrieved = createPayloadForwardingAction(RETRAIN_VALUE_LIST_RETRIEVED); +export const RETRAIN_VALUE_LIST_FAILED = 'RETRAIN_VALUE_LIST_FAILED'; +export const retrainValueListFailed = createPayloadForwardingAction(RETRAIN_VALUE_LIST_FAILED); diff --git a/src/actions/JobActions.js b/src/actions/JobActions.js index 2aaa0976..ee4ea656 100644 --- a/src/actions/JobActions.js +++ b/src/actions/JobActions.js @@ -29,6 +29,13 @@ export const decodingtRetrieved = createPayloadForwardingAction(DECODING_RETRIEV export const DECODING_FAILED = 'DECODING_FAILED'; export const decodingFailed = createPayloadForwardingAction(DECODING_FAILED); +export const ENCODED_UNIQUE_VALUES_REQUESTED = 'ENCODED_UNIQUE_VALUES_REQUESTED'; +export const encodedUniqueValuesRequested = createPayloadForwardingAction(ENCODED_UNIQUE_VALUES_REQUESTED); +export const ENCODED_UNIQUE_VALUES_RETRIEVED = 'ENCODED_UNIQUE_VALUES_RETRIEVED'; +export const encodedUniqueValuesRetrieved = createPayloadForwardingAction(ENCODED_UNIQUE_VALUES_RETRIEVED); +export const ENCODED_UNIQUE_VALUES_FAILED = 'ENCODED_UNIQUE_VALUES_FAILED'; +export const encodedUniqueValuesFailed = createPayloadForwardingAction(ENCODED_UNIQUE_VALUES_FAILED); + export const FILTER_SPLIT_CHANGED = 'FILTER_SPLIT_CHANGED'; export const PREDICTION_SPLIT_CHANGED = 'PREDICTION_SPLIT_CHANGED'; export const REPLAY_SPLIT_CHANGED = 'REPLAY_SPLIT_CHANGED'; diff --git a/src/actions/ServerActions.js b/src/actions/ServerActions.js index e2a9ce6c..4ad4bca0 100644 --- a/src/actions/ServerActions.js +++ b/src/actions/ServerActions.js @@ -1,7 +1,7 @@ import {SERVER_URL} from '../constants'; import jsonAjax from '../JSONAjaxRequest'; import {JOB_DELETED, jobsFailed, jobsRetrieved, trainingFailed, - trainingSucceeded, decodingtRetrieved, decodingFailed} from './JobActions'; + trainingSucceeded, decodingtRetrieved, decodingFailed, encodedUniqueValuesRetrieved, encodedUniqueValuesFailed} from './JobActions'; import {logInfoFailed, logInfoRetrieved, logListFailed, logListsRetrieved} from './LogActions'; import {traceListFailed, traceListRetrieved} from './TraceActions'; import {limeValueListFailed, limeValueListRetrieved} from './LimeActions'; @@ -11,7 +11,7 @@ import {predictionFailed, predictionSucceeded, replayFailed, replaySucceeded} fr import {temporalLimePredictionListRetrieved, temporalLimePredictionListFailed, temporalPredictionListRetrieved, temporalPredictionListFailed} from './PredictionAction'; import {shapValueListRetrieved, shapValueListFailed, skaterValueListRetrieved, - skaterValueListFailed, iceValueListFailed, iceValueListRetrieved} from './ExplanationActions'; + skaterValueListFailed, iceValueListFailed, iceValueListRetrieved, cffeedbackValueListRetrieved, cffeedbackValueListFailed, retrainValueListRetrieved, retrainValueListFailed} from './ExplanationActions'; export const getJobs = () => (dispatch) => { jsonAjax( @@ -69,6 +69,18 @@ export const getDecodingDf = ({id}) => (dispatch) => { ); }; +export const getEncodedUniqueValues = ({id}) => (dispatch) => { + jsonAjax( + SERVER_URL + `/jobs/unique-values/${id}`, + 'GET', + null, + (resultList) => { + dispatch(encodedUniqueValuesRetrieved(resultList)); + }, + ({error}) => dispatch(encodedUniqueValuesFailed(error)) + ); +}; + export const getSplits = () => (dispatch) => { jsonAjax( SERVER_URL + '/splits/', @@ -192,6 +204,30 @@ export const getIceValues = ({jobId, attribute}) => (dispatch) => { ); }; +export const getCfFeedbackValues = ({jobId, attribute}) => (dispatch) => { + jsonAjax( + SERVER_URL + `/explanation/cffeedback/${jobId}&${attribute}/`, + 'GET', + null, + (resul) => { + dispatch(cffeedbackValueListRetrieved(resul)); + }, + ({error}) => dispatch(cffeedbackValueListFailed(error)) + ); +}; + +export const getRetrainValues = ({jobId, featureNames, featureValues}) => (dispatch) => { + jsonAjax( + SERVER_URL + `/explanation/retrain/${jobId}&${featureNames}&${featureValues}/`, + 'GET', + null, + (resul) => { + dispatch(retrainValueListRetrieved(resul)); + }, + ({error}) => dispatch(retrainValueListFailed(error)) + ); +}; + export const getLimeTemporalStabilityValues = ({jobId, traceId}) => (dispatch) => { jsonAjax( SERVER_URL + `/explanation/lime_temporal_stability/${jobId}&${traceId}/`, diff --git a/src/components/explanation/CfFeedback.js b/src/components/explanation/CfFeedback.js new file mode 100644 index 00000000..400a5bb3 --- /dev/null +++ b/src/components/explanation/CfFeedback.js @@ -0,0 +1,244 @@ +import React, {PureComponent} from 'react'; +import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; +import PropTypes from 'prop-types'; +import CircularProgress from 'react-md/lib/Progress/CircularProgress'; +import {TextField} from 'react-md'; +import CfFeedbackResultTable from './CfFeedbackResultTable'; +import SelectField from 'react-md/lib/SelectFields'; +import {Row} from 'react-grid-system'; +import RetrainResultTable from './RetrainResultTable'; + +class CfFeedback extends PureComponent { + constructor(props) { + super(props); + let removedIndex = []; + let numberOfDropdown = 0; + let featureNames = []; + this.state = { + numberOfDropdown, + removedIndex, + featureNames + }; + } + onChangeFeatureName(value, index, event, data) { + let i=0; + let arr = this.state.featureNames; + for (i=0; i < this.state.numberOfDropdown; i++) { + if (data.id == 'features_'+i) { + arr[i] = data.value; + } + } + this.setState({featureNames: arr}); + this.setState({removedIndex: this.state.removedIndex.concat(-2)}); + } + + onChangeFeatureValue(id) { + } + + getFeatureNamesSelector(id) { + return ( + + ); + } + getFeatureValuesSelector(id) { + // let arr = {'Age': [1, 2, 2121], + // 'CType': [11, 12, 34], + // 'PClaims': ['Yes', 'No']}; + // console.log(this.state.featureNames[id]); + return ( + this.onChangeFeatureValue(id)} + /> + ); + } + + getInputText() { + return ( + + ); + } + drawLine() { + return ( +
    + ); + } + plusButton(id) { + return ( + ); + } + removeButton(id) { + return ( + ); + } + submitTopKButton() { + return ( + ); + } + evaluateFeatureButton() { + return ( + ); + } + addNewDropdowns() { + let i =0; + let arr = []; + for (i=0; i < this.state.numberOfDropdown; i++) { + if (!this.state.removedIndex.includes(i)) { + arr.push(
    + {this.getFeatureNamesSelector(i)} + {this.getFeatureValuesSelector(i)} + {this.plusButton(i)} + {this.removeButton(i)} +
    + ); + } else arr.push(null); + } + return ( +
    + {arr} +
    + ); + } + onPlusClicked() { + this.setState({numberOfDropdown: this.state.numberOfDropdown+1}); + this.setState({featureNames: this.state.featureNames.concat(null)}); + } + onRemoveClicked(index) { + this.setState({removedIndex: this.state.removedIndex.concat(index)}); + } + onSubmitTopKClicked() { + if (document.getElementById('topK') != null && (document.getElementById('topK')).value>0) { + this.props.onSubmitTopK((document.getElementById('topK')).value); + } + } + onEvaluateFeatureClicked() { + let i = 0; + let featureNames = []; + let featureValues = []; + // for (i = 0; i + {result} + + ); + } + retrainResult(result) { + return ( +

    + {result} +

    + ); + } + render() { + if (this.state.numberOfDropdown == 0) { + this.setState({numberOfDropdown: this.state.numberOfDropdown+1}); + this.setState({featureNames: this.state.featureNames.concat(null)}); + } + return ( + + + +
    + + {this.getInputText()} + {this.submitTopKButton()} + +
    + {!this.props.isCfFeedbackValuesLoaded ? : null} + + {this.drawLine()} +

    Patterns to randomise

    + {!this.props.isEncodedUniqueValuesLoaded ? + : null} + {this.addNewDropdowns()} + {!this.props.isRetrainValuesLoaded ? + : null} +
    {JSON.stringify(this.props.retrainValue) !='{}' ? + : null}
    +
    + {this.evaluateFeatureButton()} +
    +
    +
    + ); + } +} +CfFeedback.propTypes = { + jobId: PropTypes.any, + cfFeedbackValue: PropTypes.any, + isCfFeedbackValuesLoaded: PropTypes.bool, + retrainValue: PropTypes.any, + isRetrainValuesLoaded: PropTypes.bool, + isEncodedUniqueValuesLoaded: PropTypes.bool, + featureNames: PropTypes.any, + featureValues: PropTypes.any, + onSubmitTopK: PropTypes.func, + onSubmitFeatureNamesAndValues: PropTypes.func, +}; +export default CfFeedback; diff --git a/src/components/explanation/CfFeedbackResultTable.js b/src/components/explanation/CfFeedbackResultTable.js new file mode 100644 index 00000000..47d62027 --- /dev/null +++ b/src/components/explanation/CfFeedbackResultTable.js @@ -0,0 +1,51 @@ +import React, {PureComponent} from 'react'; +import {DataTable, TableBody, TableColumn, TableHeader, TableRow} from 'react-md/lib/DataTables/index'; +import PropTypes from 'prop-types'; +import {columnStyle} from '../../reference'; + +class CfFeedbackResultTable extends PureComponent { + constructor(props) { + super(props); + } + getHeaderColumns() { + const headers = ['Matrix', 'Result']; + return ( + + + + {headers.map((header) => {header})} + + + + + {'tp'} + {this.props.cfFeedbackResult['tp'].toString()} + + + {'tn'} + {this.props.cfFeedbackResult['tn'].toString()} + + + {'fp'} + {this.props.cfFeedbackResult['fp'].toString()} + + + {'fn'} + {this.props.cfFeedbackResult['fn'].toString()} + + + + ); + } + render() { + return
    + {this.getHeaderColumns()} +
    ; + } +} + +CfFeedbackResultTable.propTypes = { + cfFeedbackResult: PropTypes.any, +}; + +export default CfFeedbackResultTable; diff --git a/src/components/explanation/ICEResult.js b/src/components/explanation/ICEResult.js index 17c3cb75..806c9341 100644 --- a/src/components/explanation/ICEResult.js +++ b/src/components/explanation/ICEResult.js @@ -6,7 +6,7 @@ import SelectField from 'react-md/lib/SelectFields'; import CircularProgress from 'react-md/lib/Progress/CircularProgress'; import IceResultTable from './IceResultTable'; -class ShapResult extends PureComponent { +class ICEResult extends PureComponent { constructor(props) { super(props); this.state = { @@ -56,7 +56,7 @@ class ShapResult extends PureComponent { ); } } -ShapResult.propTypes = { +ICEResult.propTypes = { iceValueList: PropTypes.any, jobId: PropTypes.any, isIceValuesLoaded: PropTypes.bool, @@ -65,4 +65,4 @@ ShapResult.propTypes = { onChangeFeature: PropTypes.func, originalList: PropTypes.any }; -export default ShapResult; +export default ICEResult; diff --git a/src/components/explanation/RetrainResultTable.js b/src/components/explanation/RetrainResultTable.js new file mode 100644 index 00000000..56fb9fef --- /dev/null +++ b/src/components/explanation/RetrainResultTable.js @@ -0,0 +1,50 @@ +import React, {PureComponent} from 'react'; +import {DataTable, TableBody, TableColumn, TableHeader, TableRow} from 'react-md/lib/DataTables/index'; +import PropTypes from 'prop-types'; +import {columnStyle} from '../../reference'; + +class RetrainResultTable extends PureComponent { + constructor(props) { + super(props); + } + getTable() { + const headers = ['Matrix', 'Initial Result', 'Retrain Result']; + return ( + + + + {headers.map((header) => {header})} + + + + {Object.keys(this.props.initialResultValue).map( + (value, index)=> ( + + {value} + + {this.props.initialResultValue[value]} + + + {this.props.retrainResultValue[value]} + + + + ) + )} + + + ); + } + render() { + return
    + {this.getTable()} +
    ; + } +} + +RetrainResultTable.propTypes = { + initialResultValue: PropTypes.any, + retrainResultValue: PropTypes.any, +}; + +export default RetrainResultTable; diff --git a/src/components/explanation/post_hoc.js b/src/components/explanation/post_hoc.js index 485d3a87..9b8b4131 100644 --- a/src/components/explanation/post_hoc.js +++ b/src/components/explanation/post_hoc.js @@ -12,7 +12,7 @@ const PostHocExplanation = (props) => { const horizontalBarChart = ; - return + return {props.traceId != '' && props.jobId != '' ? diff --git a/src/middlewares/ServerMiddleware.js b/src/middlewares/ServerMiddleware.js index 3c27e885..36c7344a 100644 --- a/src/middlewares/ServerMiddleware.js +++ b/src/middlewares/ServerMiddleware.js @@ -16,13 +16,17 @@ import { getShapValues, getIceValues, getSkaterValues, - getDecodingDf + getDecodingDf, + getCfFeedbackValues, + getRetrainValues, + getEncodedUniqueValues } from '../actions/ServerActions'; -import {JOB_DELETE_REQUESTED, JOBS_REQUESTED, TRAINING_SUBMITTED, DECODING_REQUESTED} from '../actions/JobActions'; +import {JOB_DELETE_REQUESTED, JOBS_REQUESTED, TRAINING_SUBMITTED, DECODING_REQUESTED, ENCODED_UNIQUE_VALUES_REQUESTED} from '../actions/JobActions'; import {TRACE_LIST_REQUESTED} from '../actions/TraceActions'; import {LOG_INFO_REQUESTED, LOG_LIST_REQUESTED} from '../actions/LogActions'; import {LIME_VALUE_LIST_REQUESTED, SHAP_VALUE_LIST_REQUESTED, - ICE_VALUE_LIST_REQUESTED, SKATER_VALUE_LIST_REQUESTED} from '../actions/ExplanationActions'; + ICE_VALUE_LIST_REQUESTED, SKATER_VALUE_LIST_REQUESTED, + CFFEEDBACK_VALUE_LIST_REQUESTED, RETRAIN_VALUE_LIST_REQUESTED} from '../actions/ExplanationActions'; import {SPLIT_SUBMITTED, SPLITS_REQUESTED} from '../actions/SplitActions'; import {MODELS_REQUESTED} from '../actions/ModelActions'; import {PREDICTION_SUBMITTED, REPLAY_SUBMITTED} from '../actions/RuntimeActions'; @@ -48,6 +52,9 @@ const ACTION_TYPE_TO_SERVER_ACTION = { [TEMPORAL_STABILITY_LIME_PREDICTION_LIST_REQUESTED]: getLimeTemporalStabilityValues, [TEMPORAL_STABILITY_PREDICTION_LIST_REQUESTED]: getPredictionTemporalStabilityValues, [DECODING_REQUESTED]: getDecodingDf, + [ENCODED_UNIQUE_VALUES_REQUESTED]: getEncodedUniqueValues, + [CFFEEDBACK_VALUE_LIST_REQUESTED]: getCfFeedbackValues, + [RETRAIN_VALUE_LIST_REQUESTED]: getRetrainValues, }; const serverMiddleware = (store) => (next) => (action) => { diff --git a/src/reducers/Explanation.js b/src/reducers/Explanation.js index 6c1d3270..198e4f83 100644 --- a/src/reducers/Explanation.js +++ b/src/reducers/Explanation.js @@ -13,7 +13,15 @@ import { ICE_VALUE_LIST_FAILED, ICE_VALUE_LIST_REQUESTED, - ICE_VALUE_LIST_RETRIEVED + ICE_VALUE_LIST_RETRIEVED, + + CFFEEFBACK_VALUE_LIST_FAILED, + CFFEEDBACK_VALUE_LIST_REQUESTED, + CFFEEFBACK_VALUE_LIST_RETRIEVED, + + RETRAIN_VALUE_LIST_FAILED, + RETRAIN_VALUE_LIST_REQUESTED, + RETRAIN_VALUE_LIST_RETRIEVED } from '../actions/ExplanationActions'; const initialState = { @@ -22,10 +30,14 @@ const initialState = { shapValueList: {}, iceValueList: {}, skaterValueList: {}, + cfFeedbackValue: {}, + retrainValue: {}, isLimeValuesLoaded: true, isShapValuesLoaded: true, isSkaterValuesLoaded: true, isIceValuesLoaded: true, + isCfFeedbackLoaded: true, + isRetrainLoaded: true, }; const explanation = (state = initialState, action) => { @@ -146,6 +158,64 @@ const explanation = (state = initialState, action) => { }; } + case CFFEEDBACK_VALUE_LIST_REQUESTED: { + return { + ...state, + fetchState: {inFlight: true}, + isCfFeedbackLoaded: false, + + }; + } + + case CFFEEFBACK_VALUE_LIST_RETRIEVED: { + const cfFeedbackValue = action.payload[1]; + return { + ...state, + fetchState: {inFlight: false}, + cfFeedbackValue, + isCfFeedbackLoaded: true + }; + } + + case CFFEEFBACK_VALUE_LIST_FAILED: { + const cfFeedbackValue = initialState.cfFeedbackValue; + return { + ...state, + fetchState: {inFlight: false, error: action.payload}, + cfFeedbackValue, + isCfFeedbackLoaded: true + }; + } + + case RETRAIN_VALUE_LIST_REQUESTED: { + return { + ...state, + fetchState: {inFlight: true}, + isRetrainLoaded: false, + + }; + } + + case RETRAIN_VALUE_LIST_RETRIEVED: { + const retrainValue = action.payload[1]; + return { + ...state, + fetchState: {inFlight: false}, + retrainValue, + isRetrainLoaded: true + }; + } + + case RETRAIN_VALUE_LIST_FAILED: { + const retrainValue = initialState.retrainValue; + return { + ...state, + fetchState: {inFlight: false, error: action.payload}, + retrainValue, + isRetrainLoaded: true + }; + } + default: return state; } diff --git a/src/reducers/Jobs.js b/src/reducers/Jobs.js index cc8102bc..8630cfa1 100644 --- a/src/reducers/Jobs.js +++ b/src/reducers/Jobs.js @@ -18,7 +18,10 @@ import { TRACE_CHANGED, DECODING_REQUESTED, DECODING_FAILED, - DECODING_RETRIEVED + DECODING_RETRIEVED, + ENCODED_UNIQUE_VALUES_REQUESTED, + ENCODED_UNIQUE_VALUES_RETRIEVED, + ENCODED_UNIQUE_VALUES_FAILED } from '../actions/JobActions'; import {JOB_RUN_CHANGED} from '../actions/RuntimeActions'; import { @@ -84,7 +87,9 @@ const initialState = { selectedTrace: '', jobsById: {}, decodedDf: {}, - isDecodingLoaded: true + encodedUniqueValues: {}, + isDecodingLoaded: true, + isEncodedUniqueValuesLoaded: true }; @@ -349,6 +354,30 @@ const jobs = (state = {...initialState, ...initialFilters}, action) => { }; } + case ENCODED_UNIQUE_VALUES_REQUESTED: { + return { + ...state, + isEncodedUniqueValuesLoaded: false, + decodedDf: {} + }; + } + + case ENCODED_UNIQUE_VALUES_FAILED: { + return { + ...state, + isEncodedUniqueValuesLoaded: true, + encodedUniqueValues: initialState.encodedUniqueValues + }; + } + case ENCODED_UNIQUE_VALUES_RETRIEVED: { + const resultList = action.payload; + return { + ...state, + isEncodedUniqueValuesLoaded: true, + encodedUniqueValues: resultList + }; + } + default: return state; } diff --git a/src/util/dataReducers.js b/src/util/dataReducers.js index 9b78541a..27d9a4be 100644 --- a/src/util/dataReducers.js +++ b/src/util/dataReducers.js @@ -432,3 +432,39 @@ export const getDecodedDFTable = (dfResult) =>{ } return {data: result, headers: keys}; }; + +export const getFeatureNames = (dfResult) =>{ + let keys = Object.keys(dfResult); + return keys; +}; + +export const getUniqueFeatureValues = (dfResult) =>{ + let i=0; let j=0; + let encodedResult = {}; + let decodedResult = {}; + let keys = Object.keys(dfResult); + if (keys.length>0) { + for (i = 0; i{ + let keys = Object.keys(result); + + if (keys.length>0) { + return {'tp': result['freq_seqs_after_filter']['tp'], 'tn': result['freq_seqs_after_filter']['tn'], + 'fp': result['freq_seqs_after_filter']['fp'], 'fn': result['freq_seqs_after_filter']['fn']}; + } + return {'tp': '', 'tn': '', 'fp': '', 'fn': ''}; +}; diff --git a/src/views/Explanation/Explanation.js b/src/views/Explanation/Explanation.js index 06b28bcb..b49f91b8 100644 --- a/src/views/Explanation/Explanation.js +++ b/src/views/Explanation/Explanation.js @@ -12,7 +12,8 @@ import { TRACE_CHANGED, PREDICTION_JOB_CHANGED, decodingRequested, - decodingFailed + decodingFailed, + encodedUniqueValuesRequested, } from '../../actions/JobActions'; import {fetchStatePropType, jobPropType, selectLabelProptype} from '../../propTypes'; import {mapJobs, splitsToLabel} from '../../util/unNormalize'; @@ -21,13 +22,17 @@ import {splitsRequested} from '../../actions/SplitActions'; import {traceListRequested} from '../../actions/TraceActions'; import {limeValueListRequested, iceValueListRequested, shapValueListRequested, skaterValueListRequested, limeValueListFailed, shapValueListFailed, iceValueListFailed, - skaterValueListFailed} from '../../actions/ExplanationActions'; + skaterValueListFailed, cffeedbackValueListFailed, + cffeedbackValueListRequested, + retrainValueListRequested, + retrainValueListFailed} from '../../actions/ExplanationActions'; import ReactGA from 'react-ga'; import ExplanationHeaderCard from '../../components/explanation/ExplanationHeaderCard'; import PostHocExplanation from '../../components/explanation/post_hoc'; import DecodedDFTable from '../../components/explanation/DecodedDFTable'; import TraceExplanation from '../../components/explanation/TraceExplanation'; -import {getTraceIdsFromLogs, parseLimeResult, parseICEResult, getDecodedDFTable} from '../../util/dataReducers'; +import {getTraceIdsFromLogs, parseLimeResult, parseICEResult, getDecodedDFTable, + getFeatureNames, getUniqueFeatureValues, parseCfFeedbackResult} from '../../util/dataReducers'; import JobModelsTable from '../../components/explanation/JobModelsTable'; import TemporalStability from '../../components/explanation/TemporalStability'; import {temporalPredictionListRequested, temporalLimePredictionListRequested, @@ -36,17 +41,24 @@ import ShapResult from '../../components/explanation/ShapResult'; import ICEResult from '../../components/explanation/ICEResult'; import SkaterResult from '../../components/explanation/SkaterResult'; import {Row} from 'react-grid-system'; +import CfFeedback from '../../components/explanation/CfFeedback'; class Explanation extends Component { constructor(props) { - const selectedTrace = ''; - const selectedAttribute = ''; + let selectedTrace = ''; + let selectedAttribute = ''; + let selectedFeatureNames = []; + let selectedFeatureValues = []; const logName = 0; + let topK = -1; super(props); this.state = { selectedTrace, selectedAttribute, - logName + logName, + topK, + selectedFeatureNames, + selectedFeatureValues }; } onChangePrefix(prefixLength) { @@ -65,6 +77,9 @@ class Explanation extends Component { this.props.onRequestFailSkaterValues(null); this.props.onRequestFailIceValues(null, null); this.props.onRequestFailDecodeDF(null); + this.props.onRequestFailCfFeedbackValues(null); + this.props.onRequestFailRetrainValues(null); + this.props.onRequestFailEncodeUniqueValuesDF(null); } onChangeTrace(trace) { @@ -83,17 +98,29 @@ class Explanation extends Component { this.props.onRequestIceValues(this.props.jobId, attribute); } + onSubmitFeatureNamesAndValues(featureNames, featureValues) { + this.setState({selectedFeatureNames: featureNames}); + this.setState({selectedFeatureValues: featureValues}); + this.props.onRequestRetrainValues(this.props.jobId, featureNames, featureValues); + } + + onSubmitTopK(topK) { + this.setState({topK: topK}); + this.props.onRequestCfFeedbackValues(this.props.jobId, topK); + } + onChangeJob(id) { this.props.onJobChange(id); if (this.props.selectedTrace !== '') { this.props.onRequestLimeValues(id, this.props.selectedTrace); this.props.onRequestLimeTemporalList(id, this.props.selectedTrace); this.props.onRequestPredictionTemporalList(id, this.props.selectedTrace); - this.props.onRequestShapValues(this.props.jobId, this.props.selectedTrace); + this.props.onRequestShapValues(id, this.props.selectedTrace); } - this.props.onRequestSkaterValues(id); - this.props.onRequestDecoding(id); - this.props.onRequestIceValues(this.props.jobId, this.props.selectedAttribute); + // this.props.onRequestSkaterValues(id); + // this.props.onRequestDecoding(id); + this.props.onRequestEncodeUniqueValuesDF(id); + // this.props.onRequestIceValues(id, this.state.selectedAttribute); } componentDidMount() { @@ -131,9 +158,6 @@ class Explanation extends Component { return this.props.filteredJobs.filter(job => job.id==id)[0]; } render() { - // eslint-disable-next-line max-len - // const iceResult = parseICEResult([{'label': 'First outpatient consultation', 'value': 1.25, 'count': 48}, {'label': 'aspiration cytology behalf by p', 'value': 1.6666666666666667, 'count': 3}, {'label': 'assumption laboratory', 'value': 1.6923076923076923, 'count': 130}, {'label': 'compartment for inspection', 'value': 1.6666666666666667, 'count': 12}, {'label': 'ct abdomen', 'value': 2.0, 'count': 2}, {'label': 'cytology - abdominal tumor puncture', 'value': 1.0, 'count': 1}, {'label': 'cytology - ectocervix -', 'value': 1.32, 'count': 25}, {'label': 'cytology - vagina -', 'value': 1.2222222222222223, 'count': 9}, {'label': 'day care - all spec.beh.kind.-rev.', 'value': 1.0, 'count': 2}, {'label': 'demurrage - all spec.beh.kinderg.-Reval.', 'value': 1.7142857142857142, 'count': 28}, {'label': 'e.c.g. - Electrocardiography', 'value': 1.5, 'count': 22}, {'label': 'histological examination - biopsies nno', 'value': 1.3076923076923077, 'count': 13}, {'label': 'immuno-pathology', 'value': 1.25, 'count': 4}, {'label': 'inwend.geneesk. Out-year card costs', 'value': 2.0, 'count': 1}, {'label': 'inwend.geneesk. short-out card cost', 'value': 1.375, 'count': 8}, {'label': 'mammography chest wall', 'value': 1.3333333333333333, 'count': 3}, {'label': 'outpatient follow-up consultation', 'value': 1.087719298245614, 'count': 228}, {'label': 'telephone consultation', 'value': 1.0769230769230769, 'count': 13}, {'label': 'thorax', 'value': 1.375, 'count': 8}, {'label': 'treatment time - Unit t2 - megavolt', 'value': 1.0, 'count': 1}, {'label': 'treatment time - Unit t3 - megavolt', 'value': 1.0, 'count': 1}, {'label': 'ultrasound - internal genitals', 'value': 1.6333333333333333, 'count': 30}] - // ); let decodedDfTableResult = getDecodedDFTable(this.props.decodedDf); return (
    @@ -185,6 +209,37 @@ class Explanation extends Component { traceList={this.props.traceList} />
    +
    + + +
    +
    + +
    +
    + +
    @@ -196,38 +251,20 @@ class Explanation extends Component { jobId={this.props.jobId}/>
    - + cfFeedbackValue={parseCfFeedbackResult(this.props.cfFeedbackValue)} + isCfFeedbackValuesLoaded={this.props.isCfFeedbackValuesLoaded} + retrainValue={this.props.retrainValue} + isRetrainValuesLoaded={this.props.isRetrainValuesLoaded} + isEncodedUniqueValuesLoaded={this.props.isEncodedUniqueValuesLoaded} + featureNames={getFeatureNames(this.props.encodedUniqueValues)} + featureValues={getUniqueFeatureValues(this.props.encodedUniqueValues)} + onSubmitTopK={this.onSubmitTopK.bind(this)} + onSubmitFeatureNamesAndValues = {this.onSubmitFeatureNamesAndValues.bind(this)}/>
    -
    - -
    -
    - - -
    ); } @@ -252,6 +289,9 @@ Explanation.propTypes = { onRequestIceValues: PropTypes.func.isRequired, onRequestPredictionTemporalList: PropTypes.func.isRequired, onRequestLimeTemporalList: PropTypes.func.isRequired, + onRequestCfFeedbackValues: PropTypes.func.isRequired, + onRequestRetrainValues: PropTypes.func.isRequired, + onRequestEncodeUniqueValuesDF: PropTypes.func.isRequired, onRequestFailLimeValues: PropTypes.func.isRequired, onRequestFailLimeTemporalList: PropTypes.func.isRequired, onRequestFailPredictionTemporalList: PropTypes.func.isRequired, @@ -259,6 +299,9 @@ Explanation.propTypes = { onRequestFailSkaterValues: PropTypes.func.isRequired, onRequestFailIceValues: PropTypes.func.isRequired, onRequestFailDecodeDF: PropTypes.func.isRequired, + onRequestFailEncodeUniqueValuesDF: PropTypes.func.isRequired, + onRequestFailCfFeedbackValues: PropTypes.func.isRequired, + onRequestFailRetrainValues: PropTypes.func.isRequired, filterOptionChange: PropTypes.func.isRequired, labelTypeChange: PropTypes.func.isRequired, jobs: PropTypes.arrayOf(jobPropType).isRequired, @@ -290,6 +333,9 @@ Explanation.propTypes = { selectedAttribute: PropTypes.any, filteredJobs: PropTypes.any, decodedDf: PropTypes.any, + encodedUniqueValues: PropTypes.any, + cfFeedbackValue: PropTypes.any, + retrainValue: PropTypes.any, jobId: PropTypes.number.isRequired, isLimeTempStabilityLoaded: PropTypes.bool.isRequired, isPredictionTempStabilityLoaded: PropTypes.bool.isRequired, @@ -298,6 +344,9 @@ Explanation.propTypes = { isSkaterValuesLoaded: PropTypes.bool.isRequired, isIceValuesLoaded: PropTypes.bool.isRequired, isDecodedValueLoaded: PropTypes.bool.isRequired, + isEncodedUniqueValuesLoaded: PropTypes.bool.isRequired, + isCfFeedbackValuesLoaded: PropTypes.bool.isRequired, + isRetrainValuesLoaded: PropTypes.bool.isRequired, limeTempStabilityList: PropTypes.any, predictionTempStabilityList: PropTypes.any }; @@ -320,6 +369,12 @@ const mapStateToProps = (state) => ({ isIceValuesLoaded: state.explanation.isIceValuesLoaded, skaterValueList: state.explanation.skaterValueList, isSkaterValuesLoaded: state.explanation.isSkaterValuesLoaded, + cfFeedbackValue: state.explanation.cfFeedbackValue, + isCfFeedbackValuesLoaded: state.explanation.isCfFeedbackLoaded, + retrainValue: state.explanation.retrainValue, + isRetrainValuesLoaded: state.explanation.isRetrainLoaded, + encodedUniqueValues: state.jobs.encodedUniqueValues, + isEncodedUniqueValuesLoaded: state.jobs.isEncodedUniqueValuesLoaded, traceList: state.traces.byId, predictionMethod: state.jobs.predictionMethod, prefixLengths: state.jobs.prefixLengths.sort((a, b) => (a - b)), @@ -354,6 +409,7 @@ const mapDispatchToProps = (dispatch) => ({ onRequestJobs: () => dispatch(jobsRequested()), onRequestTraces: (id) => dispatch(traceListRequested({id})), onRequestDecoding: (id) => dispatch(decodingRequested({id})), + onRequestEncodeUniqueValuesDF: (id) => dispatch(encodedUniqueValuesRequested({id})), onRequestLimeValues: (jobId, traceId) => dispatch(limeValueListRequested({jobId, traceId})), onRequestShapValues: (jobId, traceId) => dispatch(shapValueListRequested({jobId, traceId})), onRequestIceValues: (jobId, attribute) => dispatch(iceValueListRequested({jobId, attribute})), @@ -362,6 +418,9 @@ const mapDispatchToProps = (dispatch) => ({ dispatch(temporalPredictionListRequested({jobId, traceId})), onRequestLimeTemporalList: (jobId, traceId) => dispatch(temporalLimePredictionListRequested({jobId, traceId})), + onRequestCfFeedbackValues: (jobId, attribute) => dispatch(cffeedbackValueListRequested({jobId, attribute})), + onRequestRetrainValues: (jobId, featureNames, featureValues) => + dispatch(retrainValueListRequested({jobId, featureNames, featureValues})), onRequestFailLimeValues: () => dispatch(limeValueListFailed(null)), onRequestFailShapValues: () => dispatch(shapValueListFailed(null)), onRequestFailIceValues: () => dispatch(iceValueListFailed(null)), @@ -372,6 +431,12 @@ const mapDispatchToProps = (dispatch) => ({ dispatch(temporalLimePredictionListFailed(null)), onRequestFailDecodeDF: () => dispatch(decodingFailed(null)), + onRequestFailCfFeedbackValues: () => + dispatch(cffeedbackValueListFailed(null)), + onRequestFailRetrainValues: () => + dispatch(retrainValueListFailed(null)), + onRequestFailEncodeUniqueValuesDF: () => + dispatch(retrainValueListFailed(null)), filterOptionChange: (_, event) => dispatch({ type: FILTER_OPTION_CHANGED, payload: {name: event.target.name, value: event.target.value} From 3f5ac49dad520fd2f7c350f9fee73bc4968b6eea Mon Sep 17 00:00:00 2001 From: Musacca Date: Sun, 12 Apr 2020 16:29:50 +0300 Subject: [PATCH 18/29] ignore tests for unreachable files --- .codecov.yml | 9 +++ src/views/Explanation/Explanation.js | 114 +++++++++++++-------------- 2 files changed, 66 insertions(+), 57 deletions(-) create mode 100644 .codecov.yml diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 00000000..41ad0165 --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,9 @@ +ignore: + - "src/WebSocket.js" + - "src/index.js" + - "src/actions/WebSocket.js" + - "src/middlewares/WebSocketMiddleware.js" + - "src/reducers/index.js" + - "src/views/**/*.js" + - "src/views/Split.js" + - "src/views/Labelling.js" diff --git a/src/views/Explanation/Explanation.js b/src/views/Explanation/Explanation.js index b49f91b8..279796b4 100644 --- a/src/views/Explanation/Explanation.js +++ b/src/views/Explanation/Explanation.js @@ -273,53 +273,53 @@ class Explanation extends Component { Explanation.propTypes = { fetchState: fetchStatePropType, splitLabels: selectLabelProptype, - onRequestLogList: PropTypes.func.isRequired, - onRequestSplitList: PropTypes.func.isRequired, - onRequestJobs: PropTypes.func.isRequired, - onRequestDecoding: PropTypes.func.isRequired, - onSplitChange: PropTypes.func.isRequired, - onMethodChange: PropTypes.func.isRequired, - onTraceChange: PropTypes.func.isRequired, - onPrefixChange: PropTypes.func.isRequired, - onRequestTraces: PropTypes.func.isRequired, - onJobChange: PropTypes.func.isRequired, - onRequestLimeValues: PropTypes.func.isRequired, - onRequestSkaterValues: PropTypes.func.isRequired, - onRequestShapValues: PropTypes.func.isRequired, - onRequestIceValues: PropTypes.func.isRequired, - onRequestPredictionTemporalList: PropTypes.func.isRequired, - onRequestLimeTemporalList: PropTypes.func.isRequired, - onRequestCfFeedbackValues: PropTypes.func.isRequired, - onRequestRetrainValues: PropTypes.func.isRequired, - onRequestEncodeUniqueValuesDF: PropTypes.func.isRequired, - onRequestFailLimeValues: PropTypes.func.isRequired, - onRequestFailLimeTemporalList: PropTypes.func.isRequired, - onRequestFailPredictionTemporalList: PropTypes.func.isRequired, - onRequestFailShapValues: PropTypes.func.isRequired, - onRequestFailSkaterValues: PropTypes.func.isRequired, - onRequestFailIceValues: PropTypes.func.isRequired, - onRequestFailDecodeDF: PropTypes.func.isRequired, - onRequestFailEncodeUniqueValuesDF: PropTypes.func.isRequired, - onRequestFailCfFeedbackValues: PropTypes.func.isRequired, - onRequestFailRetrainValues: PropTypes.func.isRequired, - filterOptionChange: PropTypes.func.isRequired, - labelTypeChange: PropTypes.func.isRequired, - jobs: PropTypes.arrayOf(jobPropType).isRequired, - predictionMethod: PropTypes.oneOf([CLASSIFICATION, REGRESSION, TIME_SERIES_PREDICTION, LABELLING]).isRequired, - splitId: PropTypes.number.isRequired, - prefixLengths: PropTypes.arrayOf(PropTypes.number.isRequired).isRequired, - selectedPrefixes: PropTypes.arrayOf(PropTypes.number.isRequired).isRequired, + onRequestLogList: PropTypes.func, + onRequestSplitList: PropTypes.func, + onRequestJobs: PropTypes.func, + onRequestDecoding: PropTypes.func, + onSplitChange: PropTypes.func, + onMethodChange: PropTypes.func, + onTraceChange: PropTypes.func, + onPrefixChange: PropTypes.func, + onRequestTraces: PropTypes.func, + onJobChange: PropTypes.func, + onRequestLimeValues: PropTypes.func, + onRequestSkaterValues: PropTypes.func, + onRequestShapValues: PropTypes.func, + onRequestIceValues: PropTypes.func, + onRequestPredictionTemporalList: PropTypes.func, + onRequestLimeTemporalList: PropTypes.func, + onRequestCfFeedbackValues: PropTypes.func, + onRequestRetrainValues: PropTypes.func, + onRequestEncodeUniqueValuesDF: PropTypes.func, + onRequestFailLimeValues: PropTypes.func, + onRequestFailLimeTemporalList: PropTypes.func, + onRequestFailPredictionTemporalList: PropTypes.func, + onRequestFailShapValues: PropTypes.func, + onRequestFailSkaterValues: PropTypes.func, + onRequestFailIceValues: PropTypes.func, + onRequestFailDecodeDF: PropTypes.func, + onRequestFailEncodeUniqueValuesDF: PropTypes.func, + onRequestFailCfFeedbackValues: PropTypes.func, + onRequestFailRetrainValues: PropTypes.func, + filterOptionChange: PropTypes.func, + labelTypeChange: PropTypes.func, + jobs: PropTypes.arrayOf(jobPropType), + predictionMethod: PropTypes.oneOf([CLASSIFICATION, REGRESSION, TIME_SERIES_PREDICTION, LABELLING]), + splitId: PropTypes.number, + prefixLengths: PropTypes.arrayOf(PropTypes.number), + selectedPrefixes: PropTypes.arrayOf(PropTypes.number), filterOptions: PropTypes.shape({ - encodings: PropTypes.arrayOf(PropTypes.string).isRequired, - clusterings: PropTypes.arrayOf(PropTypes.string).isRequired, - classification: PropTypes.arrayOf(PropTypes.string).isRequired, - regression: PropTypes.arrayOf(PropTypes.string).isRequired, - timeSeriesPrediction: PropTypes.arrayOf(PropTypes.string).isRequired, - labelling: PropTypes.any.isRequired, - padding: PropTypes.string.isRequired, - attributeNames: PropTypes.arrayOf(PropTypes.string).isRequired, - thresholds: PropTypes.arrayOf(PropTypes.number).isRequired - }).isRequired, + encodings: PropTypes.arrayOf(PropTypes.string), + clusterings: PropTypes.arrayOf(PropTypes.string), + classification: PropTypes.arrayOf(PropTypes.string), + regression: PropTypes.arrayOf(PropTypes.string), + timeSeriesPrediction: PropTypes.arrayOf(PropTypes.string), + labelling: PropTypes.any, + padding: PropTypes.string, + attributeNames: PropTypes.arrayOf(PropTypes.string), + thresholds: PropTypes.arrayOf(PropTypes.number) + }), clickedJobId: PropTypes.number, limeValueList: PropTypes.any, shapValueList: PropTypes.any, @@ -336,17 +336,17 @@ Explanation.propTypes = { encodedUniqueValues: PropTypes.any, cfFeedbackValue: PropTypes.any, retrainValue: PropTypes.any, - jobId: PropTypes.number.isRequired, - isLimeTempStabilityLoaded: PropTypes.bool.isRequired, - isPredictionTempStabilityLoaded: PropTypes.bool.isRequired, - isLimeValuesLoaded: PropTypes.bool.isRequired, - isShapValuesLoaded: PropTypes.bool.isRequired, - isSkaterValuesLoaded: PropTypes.bool.isRequired, - isIceValuesLoaded: PropTypes.bool.isRequired, - isDecodedValueLoaded: PropTypes.bool.isRequired, - isEncodedUniqueValuesLoaded: PropTypes.bool.isRequired, - isCfFeedbackValuesLoaded: PropTypes.bool.isRequired, - isRetrainValuesLoaded: PropTypes.bool.isRequired, + jobId: PropTypes.number, + isLimeTempStabilityLoaded: PropTypes.bool, + isPredictionTempStabilityLoaded: PropTypes.bool, + isLimeValuesLoaded: PropTypes.bool, + isShapValuesLoaded: PropTypes.bool, + isSkaterValuesLoaded: PropTypes.bool, + isIceValuesLoaded: PropTypes.bool, + isDecodedValueLoaded: PropTypes.bool, + isEncodedUniqueValuesLoaded: PropTypes.bool, + isCfFeedbackValuesLoaded: PropTypes.bool, + isRetrainValuesLoaded: PropTypes.bool, limeTempStabilityList: PropTypes.any, predictionTempStabilityList: PropTypes.any }; From 8217564d2e363d7dba248ba588ca3d46e351bc3a Mon Sep 17 00:00:00 2001 From: Musacca Date: Sun, 12 Apr 2020 18:41:09 +0300 Subject: [PATCH 19/29] reducers coverage increase --- src/__tests__/reducers/Explanation.test.js | 170 +++++++++++++++++++++ src/__tests__/reducers/Jobs.test.js | 60 +++++++- src/__tests__/reducers/Prediction.test.js | 66 ++++++++ src/__tests__/reducers/Traces.test.js | 29 +++- stories/Explanation.js | 99 ++++++++++++ 5 files changed, 420 insertions(+), 4 deletions(-) create mode 100644 src/__tests__/reducers/Explanation.test.js create mode 100644 src/__tests__/reducers/Prediction.test.js diff --git a/src/__tests__/reducers/Explanation.test.js b/src/__tests__/reducers/Explanation.test.js new file mode 100644 index 00000000..b5a2867f --- /dev/null +++ b/src/__tests__/reducers/Explanation.test.js @@ -0,0 +1,170 @@ +import explanation from '../../reducers/Explanation'; +import {limeValueListRequested, limeValueListRetrieved, limeValueListFailed, + shapValueListFailed, shapValueListRequested, shapValueListRetrieved, + iceValueListFailed, iceValueListRequested, iceValueListRetrieved, + skaterValueListFailed, skaterValueListRequested, skaterValueListRetrieved, + cffeedbackValueListFailed, cffeedbackValueListRequested, cffeedbackValueListRetrieved, + retrainValueListFailed, retrainValueListRequested, retrainValueListRetrieved} from '../../actions/ExplanationActions'; +import {limeList, shapResult, iceResultList, skaterResult, + retrainResult, cfFeedbackResult} from '../../../stories/Explanation'; + + +const initialState = { + fetchState: {inFlight: false}, + limeValueList: {}, + shapValueList: {}, + iceValueList: {}, + skaterValueList: {}, + cfFeedbackValue: {}, + retrainValue: {}, + isLimeValuesLoaded: true, + isShapValuesLoaded: true, + isSkaterValuesLoaded: true, + isIceValuesLoaded: true, + isCfFeedbackLoaded: true, + isRetrainLoaded: true, +}; + +describe('Explanation reducer', () => { + it('has nothing initially', () => { + expect(explanation(undefined, {})).toEqual(initialState); + }); + + describe('LIME List requested', () => { + const stateWithRequest = explanation(undefined, limeValueListRequested()); + + it('changes fetchState when lime requesting', () => { + expect(stateWithRequest.fetchState).toEqual({inFlight: true}); + expect(stateWithRequest.isLimeValuesLoaded).toEqual(false); + }); + + it('changes fetchState when lime request completed', () => { + const state2 = explanation(stateWithRequest, limeValueListRetrieved(limeList)); + expect(state2.fetchState).toEqual({inFlight: false}); + expect(state2.isLimeValuesLoaded).toEqual(true); + const {limeValueList} = state2; + expect(limeValueList).toEqual(limeList); + }); + + it('changes fetchState when lime request failed', () => { + const state2 = explanation(stateWithRequest, limeValueListFailed('error')); + expect(state2.fetchState).toEqual({inFlight: false, error: 'error'}); + expect(state2.isLimeValuesLoaded).toEqual(true); + }); + }); + + describe('SHAP List requested', () => { + const stateWithRequest = explanation(undefined, shapValueListRequested()); + + it('changes fetchState when shap requesting', () => { + expect(stateWithRequest.fetchState).toEqual({inFlight: true}); + expect(stateWithRequest.isShapValuesLoaded).toEqual(false); + }); + + it('changes fetchState when shap request completed', () => { + const state2 = explanation(stateWithRequest, shapValueListRetrieved(shapResult)); + expect(state2.fetchState).toEqual({inFlight: false}); + expect(state2.isShapValuesLoaded).toEqual(true); + const {shapValueList} = state2; + expect(shapValueList).toEqual(shapResult[1]); + }); + + it('changes fetchState when shap request failed', () => { + const state2 = explanation(stateWithRequest, shapValueListFailed('error')); + expect(state2.fetchState).toEqual({inFlight: false, error: 'error'}); + expect(state2.isShapValuesLoaded).toEqual(true); + }); + }); + + describe('ICE List requested', () => { + const stateWithRequest = explanation(undefined, iceValueListRequested()); + + it('changes fetchState when ice requesting', () => { + expect(stateWithRequest.fetchState).toEqual({inFlight: true}); + expect(stateWithRequest.isIceValuesLoaded).toEqual(false); + }); + + it('changes fetchState when ice request completed', () => { + const state2 = explanation(stateWithRequest, iceValueListRetrieved(iceResultList)); + expect(state2.fetchState).toEqual({inFlight: false}); + expect(state2.isIceValuesLoaded).toEqual(true); + const {iceValueList} = state2; + expect(iceValueList).toEqual(iceResultList[1]); + }); + + it('changes fetchState when ice request failed', () => { + const state2 = explanation(stateWithRequest, iceValueListFailed('error')); + expect(state2.fetchState).toEqual({inFlight: false, error: 'error'}); + expect(state2.isIceValuesLoaded).toEqual(true); + }); + }); + + describe('Skater List requested', () => { + const stateWithRequest = explanation(undefined, skaterValueListRequested()); + + it('changes fetchState when skater requesting', () => { + expect(stateWithRequest.fetchState).toEqual({inFlight: true}); + expect(stateWithRequest.isSkaterValuesLoaded).toEqual(false); + }); + + it('changes fetchState when skater request completed', () => { + const state2 = explanation(stateWithRequest, skaterValueListRetrieved(skaterResult)); + expect(state2.fetchState).toEqual({inFlight: false}); + expect(state2.isSkaterValuesLoaded).toEqual(true); + const {skaterValueList} = state2; + expect(skaterValueList).toEqual(skaterResult[1]); + }); + + it('changes fetchState when skater request failed', () => { + const state2 = explanation(stateWithRequest, skaterValueListFailed('error')); + expect(state2.fetchState).toEqual({inFlight: false, error: 'error'}); + expect(state2.isSkaterValuesLoaded).toEqual(true); + }); + }); + + describe('CfFeedback Value requested', () => { + const stateWithRequest = explanation(undefined, cffeedbackValueListRequested()); + + it('changes fetchState when CfFeedback requesting', () => { + expect(stateWithRequest.fetchState).toEqual({inFlight: true}); + expect(stateWithRequest.isCfFeedbackLoaded).toEqual(false); + }); + + it('changes fetchState when CfFeedback request completed', () => { + const state2 = explanation(stateWithRequest, cffeedbackValueListRetrieved(cfFeedbackResult)); + expect(state2.fetchState).toEqual({inFlight: false}); + expect(state2.isCfFeedbackLoaded).toEqual(true); + const {cfFeedbackValue} = state2; + expect(cfFeedbackValue).toEqual(cfFeedbackResult[1]); + }); + + it('changes fetchState when CfFeedback request failed', () => { + const state2 = explanation(stateWithRequest, cffeedbackValueListFailed('error')); + expect(state2.fetchState).toEqual({inFlight: false, error: 'error'}); + expect(state2.isCfFeedbackLoaded).toEqual(true); + }); + }); + + describe('Retrain Value requested', () => { + const stateWithRequest = explanation(undefined, retrainValueListRequested()); + + it('changes fetchState when CfFeedback requesting', () => { + expect(stateWithRequest.fetchState).toEqual({inFlight: true}); + expect(stateWithRequest.isRetrainLoaded).toEqual(false); + }); + + it('changes fetchState when CfFeedback request completed', () => { + const state2 = explanation(stateWithRequest, retrainValueListRetrieved(retrainResult)); + expect(state2.fetchState).toEqual({inFlight: false}); + expect(state2.isRetrainLoaded).toEqual(true); + const {retrainValue} = state2; + expect(retrainValue).toEqual(retrainResult[1]); + }); + + it('changes fetchState when CfFeedback request failed', () => { + const state2 = explanation(stateWithRequest, retrainValueListFailed('error')); + expect(state2.fetchState).toEqual({inFlight: false, error: 'error'}); + expect(state2.isRetrainLoaded).toEqual(true); + }); + }); +}); diff --git a/src/__tests__/reducers/Jobs.test.js b/src/__tests__/reducers/Jobs.test.js index 5a5dadde..dcfe5f6c 100644 --- a/src/__tests__/reducers/Jobs.test.js +++ b/src/__tests__/reducers/Jobs.test.js @@ -11,7 +11,14 @@ import { JOB_DELETED, jobsFailed, jobsRequested, - jobsRetrieved + jobsRetrieved, + decodingRequested, + decodingtRetrieved, + decodingFailed, + encodedUniqueValuesRetrieved, + encodedUniqueValuesRequested, + encodedUniqueValuesFailed + } from '../../actions/JobActions'; import { ATTRIBUTE_NUMBER, @@ -525,7 +532,10 @@ const changedJob = { type: 'prediction' }; -const initState = {fetchState: {inFlight: false}, byId: {}, allIds: [], filteredIds: []}; +const initState = {fetchState: {inFlight: false}, byId: {}, allIds: [], filteredIds: [], decodedDf: {}, + encodedUniqueValues: {}, + isDecodingLoaded: true, + isEncodedUniqueValuesLoaded: true}; describe('JobsReducer', () => { let state; @@ -794,4 +804,50 @@ describe('Validation filter', () => { expect(state34.attributeNames).toEqual(['name']); }); }); + + describe('Decoded dataframe list requested', () => { + const stateWithRequest = jobs(undefined, decodingRequested()); + + it('changes fetchState when decoded dataframe requesting', () => { + expect(stateWithRequest.fetchState).toEqual({inFlight: false}); + expect(stateWithRequest.isDecodingLoaded).toEqual(false); + }); + + it('changes fetchState when decoded dataframe completed', () => { + const state2 = jobs(stateWithRequest, decodingtRetrieved([12, 12])); + expect(state2.fetchState).toEqual({inFlight: false}); + expect(state2.isDecodingLoaded).toEqual(true); + const {decodedDf} = state2; + expect(decodedDf).toEqual([12, 12]); + }); + + it('changes fetchState when decoded dataframe request failed', () => { + const state2 = jobs(stateWithRequest, decodingFailed('error')); + expect(state2.fetchState).toEqual({inFlight: false}); + expect(state2.isDecodingLoaded).toEqual(true); + }); + }); + + describe('Encoded unique values list requested', () => { + const stateWithRequest = jobs(undefined, encodedUniqueValuesRequested()); + + it('changes fetchState when en encoded unique values requesting', () => { + expect(stateWithRequest.fetchState).toEqual({inFlight: false}); + expect(stateWithRequest.isEncodedUniqueValuesLoaded).toEqual(false); + }); + + it('changes fetchState when encoded unique values completed', () => { + const state2 = jobs(stateWithRequest, encodedUniqueValuesRetrieved([12, 12])); + expect(state2.fetchState).toEqual({inFlight: false}); + expect(state2.isEncodedUniqueValuesLoaded).toEqual(true); + const {encodedUniqueValues} = state2; + expect(encodedUniqueValues).toEqual([12, 12]); + }); + + it('changes fetchState when encoded unique values request failed', () => { + const state2 = jobs(stateWithRequest, encodedUniqueValuesFailed('error')); + expect(state2.fetchState).toEqual({inFlight: false}); + expect(state2.isEncodedUniqueValuesLoaded).toEqual(true); + }); + }); }); diff --git a/src/__tests__/reducers/Prediction.test.js b/src/__tests__/reducers/Prediction.test.js new file mode 100644 index 00000000..51b19dee --- /dev/null +++ b/src/__tests__/reducers/Prediction.test.js @@ -0,0 +1,66 @@ +import prediction from '../../reducers/Predictions'; +import {temporalLimePredictionListFailed, temporalLimePredictionListRequested, temporalLimePredictionListRetrieved, + temporalPredictionListFailed, temporalPredictionListRequested, temporalPredictionListRetrieved} from '../../actions/PredictionAction'; +import {limeTemporalStabilityResult, temporalStabilityResult} from '../../../stories/Explanation'; + + +const initialState = { + fetchState: {inFlight: false}, + limeTempStabilityList: {}, + predictionTempStabilityList: {}, + isLimeTempStabilityLoaded: true, + isPredictionTempStabilityLoaded: true +}; + +describe('Temporal stability reducer', () => { + it('has nothing initially', () => { + expect(prediction(undefined, {})).toEqual(initialState); + }); + + describe('Prediction temporal stability list requested', () => { + const stateWithRequest = prediction(undefined, temporalPredictionListRequested()); + + it('changes fetchState when temportal stability prediction requesting', () => { + expect(stateWithRequest.fetchState).toEqual({inFlight: true}); + expect(stateWithRequest.isPredictionTempStabilityLoaded).toEqual(false); + }); + + it('changes fetchState when temporal stability request completed', () => { + const state2 = prediction(stateWithRequest, temporalPredictionListRetrieved(temporalStabilityResult)); + expect(state2.fetchState).toEqual({inFlight: false}); + expect(state2.isPredictionTempStabilityLoaded).toEqual(true); + const {predictionTempStabilityList} = state2; + expect(predictionTempStabilityList).toEqual(temporalStabilityResult); + }); + + it('changes fetchState when temporal stability request failed', () => { + const state2 = prediction(stateWithRequest, temporalPredictionListFailed('error')); + expect(state2.fetchState).toEqual({inFlight: false, error: 'error'}); + expect(state2.isPredictionTempStabilityLoaded).toEqual(true); + }); + }); + + describe('Lime temporal stability list requested', () => { + const stateWithRequest = prediction(undefined, temporalLimePredictionListRequested()); + + it('changes fetchState when temportal stability prediction requesting', () => { + expect(stateWithRequest.fetchState).toEqual({inFlight: true}); + expect(stateWithRequest.isLimeTempStabilityLoaded).toEqual(false); + }); + + it('changes fetchState when lime temporal stability request completed', () => { + const state2 = prediction(stateWithRequest, + temporalLimePredictionListRetrieved(limeTemporalStabilityResult)); + expect(state2.fetchState).toEqual({inFlight: false}); + expect(state2.isLimeTempStabilityLoaded).toEqual(true); + const {limeTempStabilityList} = state2; + expect(limeTempStabilityList).toEqual(limeTemporalStabilityResult); + }); + + it('changes fetchState when lime temporal stability request failed', () => { + const state2 = prediction(stateWithRequest, temporalLimePredictionListFailed('error')); + expect(state2.fetchState).toEqual({inFlight: false, error: 'error'}); + expect(state2.isLimeTempStabilityLoaded).toEqual(true); + }); + }); +}); diff --git a/src/__tests__/reducers/Traces.test.js b/src/__tests__/reducers/Traces.test.js index a4ea6cf2..3165dc2b 100644 --- a/src/__tests__/reducers/Traces.test.js +++ b/src/__tests__/reducers/Traces.test.js @@ -3,7 +3,7 @@ */ import traces from '../../reducers/Traces'; -import {traceListFailed, traceListRequested, traceListRetrieved} from '../../actions/TraceActions'; +import {traceListFailed, traceListRequested, traceListRetrieved, TRACE_UPDATED, TRACE_COMPLETED} from '../../actions/TraceActions'; const traceList = [{ id: 5, @@ -146,7 +146,6 @@ describe('TraceList', () => { expect(Object.keys(state2.byId).length).toEqual(1); expect(state2.byId[0].real_log).toBe(2); }); - it('stores error message', () => { const state = traces(undefined, traceListRequested()); const state2 = traces(state, traceListFailed('error')); @@ -155,4 +154,30 @@ describe('TraceList', () => { finalDiff: [], changed: 0, interResults: [] }); }); + it('stores error message', () => { + const state = traces(undefined, traceListRequested()); + const state2 = traces(state, traceListFailed('error')); + expect(state2).toEqual({ + byId: [], fetchState: {inFlight: false, error: 'error'}, + finalDiff: [], changed: 0, interResults: [] + }); + }); + + it('Trace update', () => { + const state = traces(undefined, traceListRequested()); + const state2 = traces(state, {type: TRACE_UPDATED, byId: [], payload: traceList}); + expect(state2).toEqual({ + byId: [traceList], fetchState: {inFlight: true}, + finalDiff: [], changed: 1, interResults: [] + }); + }); + + it('Trace completed', () => { + const state = traces(undefined, traceListRequested()); + const state2 = traces(state, {type: TRACE_COMPLETED, byId: [], payload: traceList}); + expect(state2).toEqual({ + byId: [traceList], fetchState: {inFlight: true}, + finalDiff: [{'class_actual': undefined, 'diff': undefined, 'id': undefined}], changed: 1, interResults: [] + }); + }); }); diff --git a/stories/Explanation.js b/stories/Explanation.js index 34533e33..85840f12 100644 --- a/stories/Explanation.js +++ b/stories/Explanation.js @@ -122,6 +122,105 @@ export const skaterResult = [ '' ]; +export const cfFeedbackResult =[ + 'False', + { + 'confusion_matrix': { + 'tp': [ + '2_101', + '2_117' + ], + 'tn': [], + 'fp': [], + 'fn': [ + '2_115', + '2_109' + ] + }, + 'data': { + 'tp': { + '2_101': [ + 'prefix_2_Low Medical History' + ], + '2_117': [ + 'prefix_3_Low Insurance Check' + ], + }, + 'tn': {}, + 'fp': {}, + 'fn': { + '2_115': [ + 'prefix_3_High Insurance Check' + ], + '2_109': [ + 'prefix_2_Create Questionnaire', + 'prefix_3_High Medical History' + ], + } + }, + 'freq_seqs_after_filter': { + 'tp': [ + [ + [ + 'prefix_2_Low Insurance Check' + ], + 9 + ], + [ + [ + 'prefix_3_Low Medical History', + 'prefix_2_Low Insurance Check' + ], + 7 + ], + ], + 'tn': [], + 'fp': [], + 'fn': [ + [ + [ + 'prefix_3_Contact Hospital' + ], + 11 + ], + [ + [ + 'prefix_3_Contact Hospital', + 'prefix_2_Create Questionnaire' + ], + 3 + ], + ] + }, + 'filtered_freq_seqs_after_filter': { + 'tp': [], + 'tn': [], + 'fp': [], + 'fn': [] + } + } +]; + +export const retrainResult = [ + 'False', + { + 'Initial result': { + 'elapsed_time': '0.112383', + 'f1_score': 0.5783, + 'accuracy': 0.5877, + 'precision': 0.6078, + 'recall': 0.5954 + }, + 'Retrain result': { + 'elapsed_time': '0.1214', + 'f1_score': 0.5794, + 'accuracy': 0.5877, + 'precision': 0.6060, + 'recall': 0.5950 + } + } +]; + export const limeTemporalStabilityResult = { '2_3301': { 'prefix_1': { From 5ebdb6295c2078c1dcaf815df7bc98add2199fcb Mon Sep 17 00:00:00 2001 From: Musacca Date: Sun, 12 Apr 2020 23:44:56 +0300 Subject: [PATCH 20/29] increase test coverage --- .codecov.yml | 2 + src/__tests__/actions/ServerActions.test.js | 327 +++++++++++++++++- .../advanced/IncrementalTable.test.js | 21 ++ .../components/explanation/CfFeedback.test.js | 47 +++ .../explanation/CfFeedbackResult.test.js | 21 ++ .../explanation/RetrainTable.test.js | 21 ++ .../components/prediction/LogSelector.test.js | 22 ++ .../prediction/ModelSelector.test.js | 21 ++ .../components/prediction/ResultTable.test.js | 19 + .../runtime/InterResultTable.test.js | 19 + .../components/runtime/ModelSelector.test.js | 32 ++ .../components/runtime/Runtime.test.js | 20 ++ src/__tests__/reducers/Explanation.test.js | 3 +- src/__tests__/reducers/Prediction.test.js | 3 +- src/__tests__/reducers/Traces.test.js | 3 +- src/actions/ServerActions.js | 7 +- src/components/explanation/CfFeedback.js | 20 +- src/middlewares/ServerMiddleware.js | 3 +- src/views/Explanation/Explanation.js | 9 +- stories/Explanation.js | 12 + 20 files changed, 608 insertions(+), 24 deletions(-) create mode 100644 src/__tests__/components/advanced/IncrementalTable.test.js create mode 100644 src/__tests__/components/explanation/CfFeedback.test.js create mode 100644 src/__tests__/components/explanation/CfFeedbackResult.test.js create mode 100644 src/__tests__/components/explanation/RetrainTable.test.js create mode 100644 src/__tests__/components/prediction/LogSelector.test.js create mode 100644 src/__tests__/components/prediction/ModelSelector.test.js create mode 100644 src/__tests__/components/prediction/ResultTable.test.js create mode 100644 src/__tests__/components/runtime/InterResultTable.test.js create mode 100644 src/__tests__/components/runtime/ModelSelector.test.js create mode 100644 src/__tests__/components/runtime/Runtime.test.js diff --git a/.codecov.yml b/.codecov.yml index 41ad0165..8d7a6c11 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -7,3 +7,5 @@ ignore: - "src/views/**/*.js" - "src/views/Split.js" - "src/views/Labelling.js" + - "src/components/upload/ServerUpload.jsx" + - "src/components/upload/UploadDouble.jsx" diff --git a/src/__tests__/actions/ServerActions.test.js b/src/__tests__/actions/ServerActions.test.js index 9c961f45..d2d419e9 100644 --- a/src/__tests__/actions/ServerActions.test.js +++ b/src/__tests__/actions/ServerActions.test.js @@ -5,11 +5,40 @@ import { getLogList, getSplits, postSplit, - postTraining + postTraining, + getLimeValues, + getShapValues, + getIceValues, + getSkaterValues, + getLimeTemporalStabilityValues, + getPredictionTemporalStabilityValues, + getDecodingDf, + getEncodedUniqueValues, + getRetrainValues, + getCfFeedbackValues, + getModels, + postPrediction, + postReplay, + getTraceList } from '../../actions/ServerActions'; -import {JOB_DELETED, jobsFailed, jobsRetrieved, trainingFailed, trainingSucceeded} from '../../actions/JobActions'; +import {JOB_DELETED, jobsFailed, jobsRetrieved, trainingFailed, + trainingSucceeded, decodingtRetrieved, decodingFailed, + encodedUniqueValuesRetrieved, encodedUniqueValuesFailed} from '../../actions/JobActions'; import {logInfoFailed, logInfoRetrieved, logListFailed, logListsRetrieved} from '../../actions/LogActions'; import {splitFailed, splitsFailed, splitsRetrieved, splitSucceeded} from '../../actions/SplitActions'; +import {limeValueListFailed, limeValueListRetrieved, shapValueListRetrieved, + shapValueListFailed, iceValueListRetrieved, iceValueListFailed, + skaterValueListRetrieved, skaterValueListFailed, retrainValueListRetrieved, + retrainValueListFailed, cffeedbackValueListRetrieved, + cffeedbackValueListFailed} from '../../actions/ExplanationActions'; +import {limeTemporalStabilityResult, encodedUniqueDFResultList, temporalStabilityResult, + limeList, shapResult, iceResultList, skaterResult, + retrainResult, cfFeedbackResult, decodedDFResultList, traceList} from '../../../stories/Explanation'; +import {temporalLimePredictionListRetrieved, temporalPredictionListRetrieved, + temporalPredictionListFailed, temporalLimePredictionListFailed} from '../../actions/PredictionAction'; +import {modelsRetrieved, modelsFailed} from '../../actions/ModelActions'; +import {predictionSucceeded, predictionFailed, replaySucceeded, replayFailed} from '../../actions/RuntimeActions'; +import {traceListRetrieved, traceListFailed} from '../../actions/TraceActions'; // https://www.jstwister.com/post/unit-testing-beginners-guide-mock-http-and-files/ @@ -20,6 +49,8 @@ const standardError = (mockXHR) => { }; const logs = [{log: 'name'}]; +const job = {id: 1}; + const splits = [{type: 'single', config: 'like me'}]; const createMockXHR = (responseJSON, status) => { const mockXHR = { @@ -135,6 +166,46 @@ describe('ServerActions', function () { }); }); + describe('postPrediction ', () => { + it('dispatches predictionSumitted on success', () => { + mockXHR.responseText = JSON.stringify(job); + + postPrediction({})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]).toEqual(predictionSucceeded(job)); + }); + + it('dispatches predictionSumitted on error', () => { + standardError(mockXHR); + + postPrediction({})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]).toEqual(predictionFailed(error.error)); + }); + }); + + describe('postReplay', () => { + it('dispatches Replay on success', () => { + mockXHR.responseText = JSON.stringify(job); + + postReplay({})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]).toEqual(replaySucceeded(job)); + }); + + it('dispatches predictionSumitted on error', () => { + standardError(mockXHR); + + postReplay({})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]).toEqual(replayFailed(error.error)); + }); + }); + describe('getLogList', () => { describe('on success', () => { const logList = [ @@ -208,4 +279,256 @@ describe('ServerActions', function () { expect(dispatch.mock.calls[0][0]).toEqual(splitFailed(error.error)); }); }); + + describe('getModels', () => { + it('dispatches Models on success', () => { + mockXHR.responseText = JSON.stringify([]); + + getModels({})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(modelsRetrieved([])); + }); + it('dispatches Models on error', () => { + standardError(mockXHR); + + getModels({})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(modelsFailed(error.error)); + }); + }); + + describe('getTraceList', () => { + it('dispatches traceList on success', () => { + mockXHR.responseText = JSON.stringify(traceList); + + getTraceList({jobId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(traceListRetrieved(traceList)); + }); + it('dispatches traceList on error', () => { + standardError(mockXHR); + + getTraceList({jobId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(traceListFailed(error.error)); + }); + }); + + describe('getLime', () => { + it('dispatches limeRetrieved on success', () => { + mockXHR.responseText = JSON.stringify(limeList); + + getLimeValues({jobId: 1, traceId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(limeValueListRetrieved(limeList)); + }); + it('dispatches limeRetreived on error', () => { + standardError(mockXHR); + + getLimeValues({jobId: 1, traceId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(limeValueListFailed(error.error)); + }); + }); + + describe('getShap', () => { + it('dispatches shapRetrieved on success', () => { + mockXHR.responseText = JSON.stringify(shapResult); + + getShapValues({jobId: 1, traceId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(shapValueListRetrieved(shapResult)); + }); + it('dispatches shapRetreived on error', () => { + standardError(mockXHR); + + getShapValues({jobId: 1, traceId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(shapValueListFailed(error.error)); + }); + }); + + describe('getIce', () => { + it('dispatches iceRetrieved on success', () => { + mockXHR.responseText = JSON.stringify(iceResultList); + + getIceValues({jobId: 1, attribute: 'Age'})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(iceValueListRetrieved(iceResultList)); + }); + it('dispatches iceRetreived on error', () => { + standardError(mockXHR); + + getIceValues({jobId: 1, attribute: 'Age'})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(iceValueListFailed(error.error)); + }); + }); + + describe('getSkater', () => { + it('dispatches skaterRetrieved on success', () => { + mockXHR.responseText = JSON.stringify(skaterResult); + + getSkaterValues({jobId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(skaterValueListRetrieved(skaterResult)); + }); + it('dispatches skaterRetrieved on error', () => { + standardError(mockXHR); + + getSkaterValues({jobId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(skaterValueListFailed(error.error)); + }); + }); + + describe('getLimeTemporalStabilityValues', () => { + it('dispatches LimeTemporalStabilityValues on success', () => { + mockXHR.responseText = JSON.stringify(limeTemporalStabilityResult); + + getLimeTemporalStabilityValues({jobId: 1, traceId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(temporalLimePredictionListRetrieved(limeTemporalStabilityResult)); + }); + it('dispatches LimeTemporalStabilityValues on error', () => { + standardError(mockXHR); + + getLimeTemporalStabilityValues({jobId: 1, traceId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(temporalLimePredictionListFailed(error.error)); + }); + }); + + describe('getPredictionTemporalStabilityValues', () => { + it('dispatches LimeTemporalStabilityValues on success', () => { + mockXHR.responseText = JSON.stringify(temporalStabilityResult); + + getPredictionTemporalStabilityValues({jobId: 1, traceId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(temporalPredictionListRetrieved(temporalStabilityResult)); + }); + it('dispatches getPredictionTemporalStabilityValues on error', () => { + standardError(mockXHR); + + getPredictionTemporalStabilityValues({jobId: 1, traceId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(temporalPredictionListFailed(error.error)); + }); + }); + + describe('getDecodedDf', () => { + it('dispatches decodedDf on success', () => { + mockXHR.responseText = JSON.stringify(decodedDFResultList); + + getDecodingDf({jobId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(decodingtRetrieved(decodedDFResultList)); + }); + it('dispatches decodedDf on error', () => { + standardError(mockXHR); + + getDecodingDf({jobId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(decodingFailed(error.error)); + }); + }); + + describe('getEncodedUniqueValues', () => { + it('dispatches EncodedUniqueValues on success', () => { + mockXHR.responseText = JSON.stringify(encodedUniqueDFResultList); + + getEncodedUniqueValues({jobId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(encodedUniqueValuesRetrieved(encodedUniqueDFResultList)); + }); + it('dispatches EncodedUniqueValues on error', () => { + standardError(mockXHR); + + getEncodedUniqueValues({jobId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(encodedUniqueValuesFailed(error.error)); + }); + }); + + describe('getRetrainValues', () => { + it('dispatches RetrainValues on success', () => { + mockXHR.responseText = JSON.stringify(retrainResult); + + getRetrainValues({jobId: 1, featureNames: 'Age', featureValues: 23})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(retrainValueListRetrieved(retrainResult)); + }); + it('dispatches RetrainValues on error', () => { + standardError(mockXHR); + + getRetrainValues({jobId: 1, traceId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(retrainValueListFailed(error.error)); + }); + }); + + describe('getCfFeedbackValues', () => { + it('dispatches CfFeedbackValues on success', () => { + mockXHR.responseText = JSON.stringify(cfFeedbackResult); + + getCfFeedbackValues({jobId: 1, attribute: 'Age'})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(cffeedbackValueListRetrieved(cfFeedbackResult)); + }); + it('dispatches CfFeedbackValues on error', () => { + standardError(mockXHR); + + getCfFeedbackValues({jobId: 1, traceId: 1})(dispatch); + mockXHR.onreadystatechange(); + + expect(dispatch.mock.calls[0][0]) + .toEqual(cffeedbackValueListFailed(error.error)); + }); + }); }); diff --git a/src/__tests__/components/advanced/IncrementalTable.test.js b/src/__tests__/components/advanced/IncrementalTable.test.js new file mode 100644 index 00000000..25179467 --- /dev/null +++ b/src/__tests__/components/advanced/IncrementalTable.test.js @@ -0,0 +1,21 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import IncrementalTable from '../../../components/advanced/IncrementalTable'; +import {DataTable, TableBody, TableColumn, TableHeader, TablePagination, TableRow} from 'react-md/lib/DataTables/index'; +import {jobs} from '../../../../stories/JobStatusTable'; + + +describe('IncrementalTable Result Table', () => { + it('renders', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(DataTable).length).toBe(1); + expect(element.find(DataTable).at(0).find(TableRow).length).toBe(4); + expect(element.find(DataTable).at(0).find(TableBody).find(TableRow).length).toBe(3); + expect(element.find(DataTable).at(0).find(TableHeader) + .find(TableColumn).length).toBe(9); + expect(element.find(TablePagination).length).toBe(1); + }); +}); diff --git a/src/__tests__/components/explanation/CfFeedback.test.js b/src/__tests__/components/explanation/CfFeedback.test.js new file mode 100644 index 00000000..257696db --- /dev/null +++ b/src/__tests__/components/explanation/CfFeedback.test.js @@ -0,0 +1,47 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import CircularProgress from 'react-md/lib/Progress/CircularProgress'; +import {retrainResult, cfFeedbackResult} from '../../../../stories/Explanation'; +import CfFeedback from '../../../components/explanation/CfFeedback'; +import RetrainResultTable from '../../../components/explanation/RetrainResultTable'; +import {TextField} from 'react-md'; + + +describe('CfFeedback result', () => { + it('All data loaded', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(TextField).length).toBe(1); + expect(element.find(TextField).at(0).props().min).toBe(0); + expect(element.find(RetrainResultTable).length).toBe(1); + expect(element.find(CircularProgress).length).toBe(0); + }); + + // it('None of the data loaded', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(TextField).length).toBe(1); + expect(element.find(TextField).at(0).props().min).toBe(0); + expect(element.find(RetrainResultTable).length).toBe(1); + expect(element.find(CircularProgress).length).toBe(3); +}); diff --git a/src/__tests__/components/explanation/CfFeedbackResult.test.js b/src/__tests__/components/explanation/CfFeedbackResult.test.js new file mode 100644 index 00000000..e77a6c5f --- /dev/null +++ b/src/__tests__/components/explanation/CfFeedbackResult.test.js @@ -0,0 +1,21 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import {DataTable, TableBody, TableColumn, TableHeader, TablePagination, TableRow} from 'react-md/lib/DataTables/index'; +import CfFeedbackResultTable from '../../../components/explanation/CfFeedbackResultTable'; +import {cfFeedbackResult} from '../../../../stories/Explanation'; +import {parseCfFeedbackResult} from '../../../util/dataReducers'; + +describe('Cf feedback result Table', () => { + it('renders', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(DataTable).length).toBe(1); + expect(element.find(DataTable).at(0).find(TableRow).length).toBe(5); + expect(element.find(DataTable).at(0).find(TableBody).find(TableRow).length).toBe(4); + expect(element.find(DataTable).at(0).find(TableHeader) + .find(TableColumn).length).toBe(2); + expect(element.find(TablePagination).length).toBe(0); + }); +}); diff --git a/src/__tests__/components/explanation/RetrainTable.test.js b/src/__tests__/components/explanation/RetrainTable.test.js new file mode 100644 index 00000000..ff91148b --- /dev/null +++ b/src/__tests__/components/explanation/RetrainTable.test.js @@ -0,0 +1,21 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import {DataTable, TableBody, TableColumn, TableHeader, TablePagination, TableRow} from 'react-md/lib/DataTables/index'; +import {retrainResult} from '../../../../stories/Explanation'; +import RetrainResultTable from '../../../components/explanation/RetrainResultTable'; + +describe('Retrain result Table', () => { + it('renders', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(DataTable).length).toBe(1); + expect(element.find(DataTable).at(0).find(TableRow).length).toBe(6); + expect(element.find(DataTable).at(0).find(TableBody).find(TableRow).length).toBe(5); + expect(element.find(DataTable).at(0).find(TableHeader) + .find(TableColumn).length).toBe(3); + expect(element.find(TablePagination).length).toBe(0); + }); +}); diff --git a/src/__tests__/components/prediction/LogSelector.test.js b/src/__tests__/components/prediction/LogSelector.test.js new file mode 100644 index 00000000..4357df69 --- /dev/null +++ b/src/__tests__/components/prediction/LogSelector.test.js @@ -0,0 +1,22 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import LogSelector from '../../../components/prediction/LogSelector'; +import {SelectField} from 'react-md'; +import FetchState from '../../../components/FetchState'; + +let labels = ['label1', 'label2']; +describe('Log Selector', () => { + it('renders', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(SelectField).length).toBe(1); + expect(element.find(FetchState).length).toBe(1); + expect(element.find(SelectField).at(0).props().menuItems).toBe(labels); + }); +}); diff --git a/src/__tests__/components/prediction/ModelSelector.test.js b/src/__tests__/components/prediction/ModelSelector.test.js new file mode 100644 index 00000000..dd995250 --- /dev/null +++ b/src/__tests__/components/prediction/ModelSelector.test.js @@ -0,0 +1,21 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import ModelSelector from '../../../components/prediction/ModelSelector'; +import {Button} from 'react-md'; +import {jobs} from '../../../../stories/JobStatusTable'; +import IncrementalTable from '../../../components/advanced/IncrementalTable'; + + +describe('Model Selector', () => { + it('renders', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(IncrementalTable).length).toBe(1); + expect(element.find(Button).length).toBe(2); + }); +}); diff --git a/src/__tests__/components/prediction/ResultTable.test.js b/src/__tests__/components/prediction/ResultTable.test.js new file mode 100644 index 00000000..90679695 --- /dev/null +++ b/src/__tests__/components/prediction/ResultTable.test.js @@ -0,0 +1,19 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import ResultTable from '../../../components/prediction/ResultTable'; +import {DataTable, TableBody, TableColumn, TableHeader, TablePagination, TableRow} from 'react-md/lib/DataTables/index'; + +describe('Result Table', () => { + it('renders', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(DataTable).length).toBe(1); + expect(element.find(DataTable).at(0).find(TableRow).length).toBe(1); + expect(element.find(DataTable).at(0).find(TableBody).find(TableRow).length).toBe(0); + expect(element.find(DataTable).at(0).find(TableHeader) + .find(TableColumn).length).toBe(9); + expect(element.find(TablePagination).length).toBe(1); + }); +}); diff --git a/src/__tests__/components/runtime/InterResultTable.test.js b/src/__tests__/components/runtime/InterResultTable.test.js new file mode 100644 index 00000000..aff1faea --- /dev/null +++ b/src/__tests__/components/runtime/InterResultTable.test.js @@ -0,0 +1,19 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import InterResultTable from '../../../components/runtime/InterResultTable'; +import {DataTable, TableBody, TableColumn, TableHeader, TablePagination, TableRow} from 'react-md/lib/DataTables/index'; + +describe('Inter Result Table', () => { + it('renders', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(DataTable).length).toBe(1); + expect(element.find(DataTable).at(0).find(TableRow).length).toBe(1); + expect(element.find(DataTable).at(0).find(TableBody).find(TableRow).length).toBe(0); + expect(element.find(DataTable).at(0).find(TableHeader) + .find(TableColumn).length).toBe(5); + expect(element.find(TablePagination).length).toBe(1); + }); +}); diff --git a/src/__tests__/components/runtime/ModelSelector.test.js b/src/__tests__/components/runtime/ModelSelector.test.js new file mode 100644 index 00000000..09f83687 --- /dev/null +++ b/src/__tests__/components/runtime/ModelSelector.test.js @@ -0,0 +1,32 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import ModelSelector from '../../../components/runtime/ModelSelector'; +import {SelectField, Button} from 'react-md'; + +let regressionList = ['reg1', 'reg2']; +let classificationList = ['clas1', 'clas2']; +let timeSeriesList = ['timeSeries1', 'timeSeries2']; + +describe('Model Selector', () => { + it('renders', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(SelectField).length).toBe(3); + expect(element.find(Button).length).toBe(2); + expect(element.find(SelectField).at(0).props().menuItems.length).toBe(2); + expect(element.find(SelectField).at(1).props().menuItems.length).toBe(2); + expect(element.find(SelectField).at(2).props().menuItems.length).toBe(2); + expect(element.find(SelectField).at(0).props().menuItems).toBe(regressionList); + expect(element.find(SelectField).at(1).props().menuItems).toBe(classificationList); + expect(element.find(SelectField).at(2).props().menuItems).toBe(timeSeriesList); + }); +}); diff --git a/src/__tests__/components/runtime/Runtime.test.js b/src/__tests__/components/runtime/Runtime.test.js new file mode 100644 index 00000000..fa818bf3 --- /dev/null +++ b/src/__tests__/components/runtime/Runtime.test.js @@ -0,0 +1,20 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import RuntimeTable from '../../../components/runtime/RuntimeTable'; +import {DataTable, TableBody, TableColumn, TableHeader, TablePagination, TableRow} from 'react-md/lib/DataTables/index'; +import {jobs} from '../../../../stories/JobStatusTable'; + +describe('RuntimeTable Result Table', () => { + it('renders', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(DataTable).length).toBe(1); + expect(element.find(DataTable).at(0).find(TableRow).length).toBe(4); + expect(element.find(DataTable).at(0).find(TableBody).find(TableRow).length).toBe(3); + expect(element.find(DataTable).at(0).find(TableHeader) + .find(TableColumn).length).toBe(5); + expect(element.find(TablePagination).length).toBe(1); + }); +}); diff --git a/src/__tests__/reducers/Explanation.test.js b/src/__tests__/reducers/Explanation.test.js index b5a2867f..5e7504dc 100644 --- a/src/__tests__/reducers/Explanation.test.js +++ b/src/__tests__/reducers/Explanation.test.js @@ -4,7 +4,8 @@ import {limeValueListRequested, limeValueListRetrieved, limeValueListFailed, iceValueListFailed, iceValueListRequested, iceValueListRetrieved, skaterValueListFailed, skaterValueListRequested, skaterValueListRetrieved, cffeedbackValueListFailed, cffeedbackValueListRequested, cffeedbackValueListRetrieved, - retrainValueListFailed, retrainValueListRequested, retrainValueListRetrieved} from '../../actions/ExplanationActions'; + retrainValueListFailed, retrainValueListRequested, + retrainValueListRetrieved} from '../../actions/ExplanationActions'; import {limeList, shapResult, iceResultList, skaterResult, retrainResult, cfFeedbackResult} from '../../../stories/Explanation'; diff --git a/src/__tests__/reducers/Prediction.test.js b/src/__tests__/reducers/Prediction.test.js index 51b19dee..4e9ee1a3 100644 --- a/src/__tests__/reducers/Prediction.test.js +++ b/src/__tests__/reducers/Prediction.test.js @@ -1,6 +1,7 @@ import prediction from '../../reducers/Predictions'; import {temporalLimePredictionListFailed, temporalLimePredictionListRequested, temporalLimePredictionListRetrieved, - temporalPredictionListFailed, temporalPredictionListRequested, temporalPredictionListRetrieved} from '../../actions/PredictionAction'; + temporalPredictionListFailed, temporalPredictionListRequested, + temporalPredictionListRetrieved} from '../../actions/PredictionAction'; import {limeTemporalStabilityResult, temporalStabilityResult} from '../../../stories/Explanation'; diff --git a/src/__tests__/reducers/Traces.test.js b/src/__tests__/reducers/Traces.test.js index 3165dc2b..6db2e588 100644 --- a/src/__tests__/reducers/Traces.test.js +++ b/src/__tests__/reducers/Traces.test.js @@ -3,7 +3,8 @@ */ import traces from '../../reducers/Traces'; -import {traceListFailed, traceListRequested, traceListRetrieved, TRACE_UPDATED, TRACE_COMPLETED} from '../../actions/TraceActions'; +import {traceListFailed, traceListRequested, traceListRetrieved, + TRACE_UPDATED, TRACE_COMPLETED} from '../../actions/TraceActions'; const traceList = [{ id: 5, diff --git a/src/actions/ServerActions.js b/src/actions/ServerActions.js index 4ad4bca0..5a5ec93b 100644 --- a/src/actions/ServerActions.js +++ b/src/actions/ServerActions.js @@ -1,7 +1,8 @@ import {SERVER_URL} from '../constants'; import jsonAjax from '../JSONAjaxRequest'; import {JOB_DELETED, jobsFailed, jobsRetrieved, trainingFailed, - trainingSucceeded, decodingtRetrieved, decodingFailed, encodedUniqueValuesRetrieved, encodedUniqueValuesFailed} from './JobActions'; + trainingSucceeded, decodingtRetrieved, decodingFailed, + encodedUniqueValuesRetrieved, encodedUniqueValuesFailed} from './JobActions'; import {logInfoFailed, logInfoRetrieved, logListFailed, logListsRetrieved} from './LogActions'; import {traceListFailed, traceListRetrieved} from './TraceActions'; import {limeValueListFailed, limeValueListRetrieved} from './LimeActions'; @@ -11,7 +12,9 @@ import {predictionFailed, predictionSucceeded, replayFailed, replaySucceeded} fr import {temporalLimePredictionListRetrieved, temporalLimePredictionListFailed, temporalPredictionListRetrieved, temporalPredictionListFailed} from './PredictionAction'; import {shapValueListRetrieved, shapValueListFailed, skaterValueListRetrieved, - skaterValueListFailed, iceValueListFailed, iceValueListRetrieved, cffeedbackValueListRetrieved, cffeedbackValueListFailed, retrainValueListRetrieved, retrainValueListFailed} from './ExplanationActions'; + skaterValueListFailed, iceValueListFailed, iceValueListRetrieved, + cffeedbackValueListRetrieved, cffeedbackValueListFailed, retrainValueListRetrieved, + retrainValueListFailed} from './ExplanationActions'; export const getJobs = () => (dispatch) => { jsonAjax( diff --git a/src/components/explanation/CfFeedback.js b/src/components/explanation/CfFeedback.js index 400a5bb3..ae36ff69 100644 --- a/src/components/explanation/CfFeedback.js +++ b/src/components/explanation/CfFeedback.js @@ -166,15 +166,15 @@ class CfFeedback extends PureComponent { let i = 0; let featureNames = []; let featureValues = []; - // for (i = 0; i : null}
    -
    +
    {this.evaluateFeatureButton()}
    diff --git a/src/middlewares/ServerMiddleware.js b/src/middlewares/ServerMiddleware.js index 36c7344a..de139ddc 100644 --- a/src/middlewares/ServerMiddleware.js +++ b/src/middlewares/ServerMiddleware.js @@ -21,7 +21,8 @@ import { getRetrainValues, getEncodedUniqueValues } from '../actions/ServerActions'; -import {JOB_DELETE_REQUESTED, JOBS_REQUESTED, TRAINING_SUBMITTED, DECODING_REQUESTED, ENCODED_UNIQUE_VALUES_REQUESTED} from '../actions/JobActions'; +import {JOB_DELETE_REQUESTED, JOBS_REQUESTED, TRAINING_SUBMITTED, + DECODING_REQUESTED, ENCODED_UNIQUE_VALUES_REQUESTED} from '../actions/JobActions'; import {TRACE_LIST_REQUESTED} from '../actions/TraceActions'; import {LOG_INFO_REQUESTED, LOG_LIST_REQUESTED} from '../actions/LogActions'; import {LIME_VALUE_LIST_REQUESTED, SHAP_VALUE_LIST_REQUESTED, diff --git a/src/views/Explanation/Explanation.js b/src/views/Explanation/Explanation.js index 279796b4..316cbb71 100644 --- a/src/views/Explanation/Explanation.js +++ b/src/views/Explanation/Explanation.js @@ -117,10 +117,10 @@ class Explanation extends Component { this.props.onRequestPredictionTemporalList(id, this.props.selectedTrace); this.props.onRequestShapValues(id, this.props.selectedTrace); } - // this.props.onRequestSkaterValues(id); - // this.props.onRequestDecoding(id); + this.props.onRequestSkaterValues(id); + this.props.onRequestDecoding(id); this.props.onRequestEncodeUniqueValuesDF(id); - // this.props.onRequestIceValues(id, this.state.selectedAttribute); + this.props.onRequestIceValues(id, this.state.selectedAttribute); } componentDidMount() { @@ -173,9 +173,6 @@ class Explanation extends Component { jobId={this.props.jobId} />
    - {/*
    - -
    */}
    Date: Sun, 19 Apr 2020 14:06:13 +0300 Subject: [PATCH 21/29] increase test coverage --- .codecov.yml | 4 + package-lock.json | 678 +++++++++++++++++- package.json | 4 + src/__tests__/actions/ServerActions.test.js | 2 +- src/__tests__/components/WalkTrough.test.js | 4 + .../components/advanced/Checkbox.test.js | 15 + .../components/advanced/Incremental.test.js | 17 + .../advanced/Regression/RegressionNN.test.js | 19 + .../ClassificationAdaptiveTree.test.js | 19 + .../ClassificationHoeffdingTree.test.js | 19 + .../classification/ClassificationNN.test.js | 18 + .../ClassificationNaiveBayes.test.js | 18 + .../ClassificationPerceptron.test.js | 19 + .../ClassificationSGDClassifier.test.js | 19 + .../components/explanation/CfFeedback.test.js | 48 +- ...test.js => CfFeedbackResulttTable.test.js} | 19 +- .../components/static/HelpDialog.test.js | 31 + .../TimeSeriesPredictionMethodsCard.test.js | 41 ++ src/__tests__/util/labelCompare.test.js | 24 +- src/actions/ServerActions.js | 10 +- src/components/explanation/CfFeedback.js | 218 ++++-- .../explanation/CfFeedbackResultTable.js | 51 -- .../explanation/CfFeedbackResulttTable.js | 114 +++ .../static/TimeSeriesPredictionMethodsCard.js | 2 + src/reducers/Explanation.js | 4 +- src/util/dataReducers.js | 194 ++++- src/views/Explanation/Explanation.js | 33 +- src/views/Validation/Validation.js | 10 +- stories/Explanation.js | 10 + 29 files changed, 1487 insertions(+), 177 deletions(-) create mode 100644 src/__tests__/components/advanced/Checkbox.test.js create mode 100644 src/__tests__/components/advanced/Incremental.test.js create mode 100644 src/__tests__/components/advanced/Regression/RegressionNN.test.js create mode 100644 src/__tests__/components/advanced/classification/ClassificationAdaptiveTree.test.js create mode 100644 src/__tests__/components/advanced/classification/ClassificationHoeffdingTree.test.js create mode 100644 src/__tests__/components/advanced/classification/ClassificationNN.test.js create mode 100644 src/__tests__/components/advanced/classification/ClassificationNaiveBayes.test.js create mode 100644 src/__tests__/components/advanced/classification/ClassificationPerceptron.test.js create mode 100644 src/__tests__/components/advanced/classification/ClassificationSGDClassifier.test.js rename src/__tests__/components/explanation/{CfFeedbackResult.test.js => CfFeedbackResulttTable.test.js} (50%) create mode 100644 src/__tests__/components/static/HelpDialog.test.js create mode 100644 src/__tests__/components/static/TimeSeriesPredictionMethodsCard.test.js delete mode 100644 src/components/explanation/CfFeedbackResultTable.js create mode 100644 src/components/explanation/CfFeedbackResulttTable.js diff --git a/.codecov.yml b/.codecov.yml index 8d7a6c11..4e00dee4 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -9,3 +9,7 @@ ignore: - "src/views/Labelling.js" - "src/components/upload/ServerUpload.jsx" - "src/components/upload/UploadDouble.jsx" + - "src/components/advanced/Checkbox.js + - "src/components/advanced/Incremental.js + - "src/components/advanced/IncrementalTable.js + - "src/components/prediction/**/*.js" diff --git a/package-lock.json b/package-lock.json index 7f92c456..9e84a53b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1254,6 +1254,174 @@ "integrity": "sha512-QsYGKdhhuDFNq7bjm2r44y0mp5xW3uO3csuTPDWZc0OIiMQv+AIY5Cqwd4mJiC5N8estVl7qlvOx1hbtOuUWbw==", "dev": true }, + "@material-ui/core": { + "version": "4.9.10", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.9.10.tgz", + "integrity": "sha512-CQuZU9Y10RkwSdxjn785kw2EPcXhv5GKauuVQufR9LlD37kjfn21Im1yvr6wsUzn81oLhEvVPz727UWC0gbqxg==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.9.10", + "@material-ui/system": "^4.9.10", + "@material-ui/types": "^5.0.1", + "@material-ui/utils": "^4.9.6", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "^1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0", + "react-transition-group": "^4.3.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "dom-helpers": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.4.tgz", + "integrity": "sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^2.6.7" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, + "react-transition-group": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.3.0.tgz", + "integrity": "sha512-1qRV1ZuVSdxPlPf4O8t7inxUGpdyO5zG9IoNfJxSO0ImU2A1YWkEQvFPuIPZmMLkg5hYs7vv5mMOyfgSkvAwvw==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, + "@material-ui/styles": { + "version": "4.9.10", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.9.10.tgz", + "integrity": "sha512-EXIXlqVyFDnjXF6tj72y6ZxiSy+mHtrsCo3Srkm3XUeu3Z01aftDBy7ZSr3TQ02gXHTvDSBvegp3Le6p/tl7eA==", + "requires": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "^5.0.1", + "@material-ui/utils": "^4.9.6", + "clsx": "^1.0.2", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.0.3", + "jss-plugin-camel-case": "^10.0.3", + "jss-plugin-default-unit": "^10.0.3", + "jss-plugin-global": "^10.0.3", + "jss-plugin-nested": "^10.0.3", + "jss-plugin-props-sort": "^10.0.3", + "jss-plugin-rule-value-function": "^10.0.3", + "jss-plugin-vendor-prefixer": "^10.0.3", + "prop-types": "^15.7.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, + "@material-ui/system": { + "version": "4.9.10", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.9.10.tgz", + "integrity": "sha512-E+t0baX2TBZk6ALm8twG6objpsxLdMM4MDm1++LMt2m7CetCAEc3aIAfDaprk4+tm5hFT1Cah5dRWk8EeIFQYw==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.9.6", + "prop-types": "^15.7.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, + "@material-ui/types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.0.1.tgz", + "integrity": "sha512-wURPSY7/3+MAtng3i26g+WKwwNE3HEeqa/trDBR5+zWKmcjO+u9t7Npu/J1r+3dmIa/OeziN9D/18IrBKvKffw==" + }, + "@material-ui/utils": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.9.6.tgz", + "integrity": "sha512-gqlBn0JPPTUZeAktn1rgMcy9Iczrr74ecx31tyZLVGdBGGzsxzM6PP6zeS7FuoLS6vG4hoZP7hWnOoHtkR0Kvw==", + "requires": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -1270,6 +1438,37 @@ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", "dev": true }, + "@popperjs/core": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.3.3.tgz", + "integrity": "sha512-yEvVC8RfhRPkD9TUn7cFcLcgoJePgZRAOR7T21rcRY5I8tpuhzeWfGa7We7tB14fe9R7wENdqUABcMdwD4SQLw==" + }, + "@restart/context": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", + "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==" + }, + "@restart/hooks": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.22.tgz", + "integrity": "sha512-tW0T3hP6emYNOc76/iC96rlu+f7JYLSVk/Wnn+7dj1gJUcw4CkQNLy16vx2mBLtVKsFMZ9miVEZXat8blruDHQ==", + "requires": { + "lodash": "^4.17.15", + "lodash-es": "^4.17.15" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash-es": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", + "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" + } + } + }, "@storybook/addons": { "version": "4.0.12", "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-4.0.12.tgz", @@ -1985,6 +2184,31 @@ "csstype": "^2.2.0" } }, + "@types/react-native": { + "version": "0.62.2", + "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.62.2.tgz", + "integrity": "sha512-oIUIbqZNN9vRnGKWHYbTVp/GyTqdaM5mfy1s4zsi6BYvHAaFOPZ32IrhIHno/A5XOv4wuGfE7g5fliDk/H0+/Q==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-native-vector-icons": { + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/@types/react-native-vector-icons/-/react-native-vector-icons-6.4.5.tgz", + "integrity": "sha512-JBpcjWQE4n0GlE0p6HpDDclT+uXpFC453T5k4h+B38q0utlGJhvgNr8899BoJGc1xOktA2cgqFKmFMJd0h7YaA==", + "requires": { + "@types/react": "*", + "@types/react-native": "*" + } + }, + "@types/react-transition-group": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.2.4.tgz", + "integrity": "sha512-8DMUaDqh0S70TjkqU0DxOu80tFUiiaS9rxkWip/nb7gtvAsbqOXm02UCmR8zdcjWujgeYPiPNTVpVpKzUDotwA==", + "requires": { + "@types/react": "*" + } + }, "@types/tapable": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.2.tgz", @@ -3626,6 +3850,11 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, + "bootstrap": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz", + "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==" + }, "boxen": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-2.1.0.tgz", @@ -4330,6 +4559,11 @@ } } }, + "clsx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", + "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -4409,7 +4643,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", - "dev": true, "requires": { "color-convert": "^1.9.1", "color-string": "^1.5.2" @@ -4419,7 +4652,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -4427,14 +4659,12 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "dev": true, "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -4926,6 +5156,30 @@ "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=", "dev": true }, + "css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "requires": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, "css-what": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", @@ -5251,6 +5505,11 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "deepmerge": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", + "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==" + }, "default-gateway": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", @@ -8454,6 +8713,11 @@ } } }, + "hyphenate-style-name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", + "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==" + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -9052,6 +9316,11 @@ "is-extglob": "^2.1.1" } }, + "is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -11339,6 +11608,203 @@ "verror": "1.10.0" } }, + "jss": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.1.1.tgz", + "integrity": "sha512-Xz3qgRUFlxbWk1czCZibUJqhVPObrZHxY3FPsjCXhDld4NOj1BgM14Ir5hVm+Qr6OLqVljjGvoMcCdXNOAbdkQ==", + "requires": { + "@babel/runtime": "^7.3.1", + "csstype": "^2.6.5", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, + "jss-plugin-camel-case": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.1.1.tgz", + "integrity": "sha512-MDIaw8FeD5uFz1seQBKz4pnvDLnj5vIKV5hXSVdMaAVq13xR6SVTVWkIV/keyTs5txxTvzGJ9hXoxgd1WTUlBw==", + "requires": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.1.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, + "jss-plugin-default-unit": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.1.1.tgz", + "integrity": "sha512-UkeVCA/b3QEA4k0nIKS4uWXDCNmV73WLHdh2oDGZZc3GsQtlOCuiH3EkB/qI60v2MiCq356/SYWsDXt21yjwdg==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.1.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, + "jss-plugin-global": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.1.1.tgz", + "integrity": "sha512-VBG3wRyi3Z8S4kMhm8rZV6caYBegsk+QnQZSVmrWw6GVOT/Z4FA7eyMu5SdkorDlG/HVpHh91oFN56O4R9m2VA==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.1.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, + "jss-plugin-nested": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.1.1.tgz", + "integrity": "sha512-ozEu7ZBSVrMYxSDplPX3H82XHNQk2DQEJ9TEyo7OVTPJ1hEieqjDFiOQOxXEj9z3PMqkylnUbvWIZRDKCFYw5Q==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.1.1", + "tiny-warning": "^1.0.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, + "jss-plugin-props-sort": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.1.1.tgz", + "integrity": "sha512-g/joK3eTDZB4pkqpZB38257yD4LXB0X15jxtZAGbUzcKAVUHPl9Jb47Y7lYmiGsShiV4YmQRqG1p2DHMYoK91g==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.1.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, + "jss-plugin-rule-value-function": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.1.1.tgz", + "integrity": "sha512-ClV1lvJ3laU9la1CUzaDugEcwnpjPTuJ0yGy2YtcU+gG/w9HMInD5vEv7xKAz53Bk4WiJm5uLOElSEshHyhKNw==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.1.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, + "jss-plugin-vendor-prefixer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.1.1.tgz", + "integrity": "sha512-09MZpQ6onQrhaVSF6GHC4iYifQ7+4YC/tAP6D4ZWeZotvCMq1mHLqNKRIaqQ2lkgANjlEot2JnVi1ktu4+L4pw==", + "requires": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.7", + "jss": "10.1.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, "jsx-ast-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.1.0.tgz", @@ -12549,6 +13015,11 @@ "mimic-fn": "^1.0.0" } }, + "opencollective-postinstall": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==" + }, "opn": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", @@ -13008,6 +13479,11 @@ "ts-pnp": "^1.0.0" } }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, "portfinder": { "version": "1.0.20", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", @@ -14216,6 +14692,25 @@ "react-is": "^16.8.1" } }, + "prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "requires": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "dependencies": { + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, "property-information": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.1.0.tgz", @@ -14505,6 +15000,69 @@ "pure-color": "^1.2.0" } }, + "react-bootstrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.0.0.tgz", + "integrity": "sha512-Ep6ZNH6wL5m9bytOS6T9mjSz0YE1bEkc+uHItvenRcA3amr5ApkpKYzAWgdglhRPZHPvm+pnqs1z5IPwv/2UZw==", + "requires": { + "@babel/runtime": "^7.4.2", + "@restart/context": "^2.1.4", + "@restart/hooks": "^0.3.21", + "@types/react": "^16.9.23", + "classnames": "^2.2.6", + "dom-helpers": "^5.1.2", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "prop-types-extra": "^1.1.0", + "react-overlays": "^3.0.1", + "react-transition-group": "^4.0.0", + "uncontrollable": "^7.0.0", + "warning": "^4.0.3" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "dom-helpers": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.4.tgz", + "integrity": "sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^2.6.7" + } + }, + "react-transition-group": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.3.0.tgz", + "integrity": "sha512-1qRV1ZuVSdxPlPf4O8t7inxUGpdyO5zG9IoNfJxSO0ImU2A1YWkEQvFPuIPZmMLkg5hYs7vv5mMOyfgSkvAwvw==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, "react-d3-tree": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/react-d3-tree/-/react-d3-tree-1.16.1.tgz", @@ -14970,6 +15528,81 @@ } } }, + "react-native-elements": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/react-native-elements/-/react-native-elements-1.2.7.tgz", + "integrity": "sha512-0S+0R1cbItl15i64qrkWnyMztwpw60d0SUsZGVDKRAMf0Jvq9Clgyh/MzxJx2sr42mbedQP1sg5Et4fZM7Fp1w==", + "requires": { + "@types/react-native-vector-icons": "^6.4.4", + "color": "^3.1.0", + "deepmerge": "^3.1.0", + "hoist-non-react-statics": "^3.1.0", + "opencollective-postinstall": "^2.0.0", + "prop-types": "^15.7.2", + "react-native-ratings": "^6.3.0", + "react-native-status-bar-height": "^2.2.0" + } + }, + "react-native-ratings": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/react-native-ratings/-/react-native-ratings-6.5.0.tgz", + "integrity": "sha512-YMcfQ7UQCmXGEc/WPlukHSHs5yvckTwjq5fTRk1FG8gaO7fZCNygEUGPuw4Dbvvp3IlsCUn0bOQd63RYsb7NDQ==", + "requires": { + "lodash": "^4.17.4", + "prop-types": "^15.5.10" + } + }, + "react-native-status-bar-height": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-native-status-bar-height/-/react-native-status-bar-height-2.5.0.tgz", + "integrity": "sha512-sYBCPYA/NapBSHkdm/IVL4ID3LLlIuLqINi2FBDyMkc2BU9pfSGOtkz9yfxoK39mYJuTrlTOQ7mManARUsYDSA==" + }, + "react-overlays": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-3.0.1.tgz", + "integrity": "sha512-QEt6I3Cjy06pe2FwY/tuWaXEzSVOuXfP8zsC6oWHJhMYpEJQgZV/TCwbCw5slMW6VcgwcWPc4HrBzN0yfxf5Xw==", + "requires": { + "@babel/runtime": "^7.4.5", + "@popperjs/core": "^2.0.0", + "@restart/hooks": "^0.3.12", + "dom-helpers": "^5.1.0", + "prop-types": "^15.7.2", + "uncontrollable": "^7.0.0", + "warning": "^4.0.3" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "dom-helpers": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.4.tgz", + "integrity": "sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^2.6.7" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, "react-prop-types": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz", @@ -17276,7 +17909,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, "requires": { "is-arrayish": "^0.3.1" }, @@ -17284,8 +17916,7 @@ "is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" } } }, @@ -18486,6 +19117,11 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", "dev": true }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -18691,6 +19327,32 @@ } } }, + "uncontrollable": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.1.1.tgz", + "integrity": "sha512-EcPYhot3uWTS3w00R32R2+vS8Vr53tttrvMj/yA1uYRhf8hbTG2GyugGqWDY0qIskxn0uTTojVd6wPYW9ZEf8Q==", + "requires": { + "@babel/runtime": "^7.6.3", + "@types/react": "^16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + } + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", diff --git a/package.json b/package.json index 6b589cf4..e6f149e5 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,9 @@ "react-scripts": "^2.1.8" }, "dependencies": { + "@material-ui/core": "^4.9.10", "apexcharts": "^3.10.1", + "bootstrap": "^4.4.1", "dompurify": "^2.0.8", "graphviz-react": "^1.0.4", "loader-runner": "^3.0.0", @@ -27,6 +29,7 @@ "react": "16.3.2", "react-apexcharts": "^1.3.3", "react-aspect-ratio": "^1.0.42", + "react-bootstrap": "^1.0.0", "react-d3-tree": "^1.16.1", "react-dom": "16.3.3", "react-full-screen": "^0.2.4", @@ -37,6 +40,7 @@ "react-html-parser": "^1.0.3", "react-json-tree": "^0.11.0", "react-md": "^1.12.1", + "react-native-elements": "^1.2.7", "react-redux": "^5.0.3", "react-router": "3.2.0", "react-router-dom": "^4.1.1", diff --git a/src/__tests__/actions/ServerActions.test.js b/src/__tests__/actions/ServerActions.test.js index d2d419e9..19369204 100644 --- a/src/__tests__/actions/ServerActions.test.js +++ b/src/__tests__/actions/ServerActions.test.js @@ -494,7 +494,7 @@ describe('ServerActions', function () { it('dispatches RetrainValues on success', () => { mockXHR.responseText = JSON.stringify(retrainResult); - getRetrainValues({jobId: 1, featureNames: 'Age', featureValues: 23})(dispatch); + getRetrainValues({jobId: 1, data: []})(dispatch); mockXHR.onreadystatechange(); expect(dispatch.mock.calls[0][0]) diff --git a/src/__tests__/components/WalkTrough.test.js b/src/__tests__/components/WalkTrough.test.js index 722d4127..fd418cf5 100644 --- a/src/__tests__/components/WalkTrough.test.js +++ b/src/__tests__/components/WalkTrough.test.js @@ -1,9 +1,13 @@ import React from 'react'; import {shallow} from 'enzyme'; import WalkThrough from '../../components/WalkThrough'; +import {List} from 'react-md'; +import GuideItem from '../../components/static/GuideItem'; it('renders', () => { const element = shallow(); expect(element).toBeDefined(); + expect(element.find(List).length).toBe(1); + expect(element.find(GuideItem).length).toBeGreaterThanOrEqual(7); }); diff --git a/src/__tests__/components/advanced/Checkbox.test.js b/src/__tests__/components/advanced/Checkbox.test.js new file mode 100644 index 00000000..4b8ef151 --- /dev/null +++ b/src/__tests__/components/advanced/Checkbox.test.js @@ -0,0 +1,15 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import Checkbox + from '../../../components/advanced/Checkbox'; +const onChange = jest.fn(); + +describe('IncrementalTable Result Table', () => { + it('renders', () => { + const element = shallow(); + expect(element).toBeDefined(); + }); +}); + diff --git a/src/__tests__/components/advanced/Incremental.test.js b/src/__tests__/components/advanced/Incremental.test.js new file mode 100644 index 00000000..d932c0bd --- /dev/null +++ b/src/__tests__/components/advanced/Incremental.test.js @@ -0,0 +1,17 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import Incremental from '../../../components/advanced/Incremental'; +import {jobs} from '../../../../stories/JobStatusTable'; + + +describe('IncrementalTable Result Table', () => { + it('renders', () => { + const element = shallow(); + expect(element).toBeDefined(); + }); +}); diff --git a/src/__tests__/components/advanced/Regression/RegressionNN.test.js b/src/__tests__/components/advanced/Regression/RegressionNN.test.js new file mode 100644 index 00000000..51f1543f --- /dev/null +++ b/src/__tests__/components/advanced/Regression/RegressionNN.test.js @@ -0,0 +1,19 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import RegressionNN + from '../../../../components/advanced/regression/RegressionNN'; +import {TextField, SelectField} from 'react-md'; + +const onChange = jest.fn(); + +describe('RegressionNN result', () => { + it('Data loaded', () => { + const element = shallow(); + + expect(element).toBeDefined(); + expect(element.find(TextField).length).toBe(4); + expect(element.find(SelectField).length).toBe(1); + }); +}); diff --git a/src/__tests__/components/advanced/classification/ClassificationAdaptiveTree.test.js b/src/__tests__/components/advanced/classification/ClassificationAdaptiveTree.test.js new file mode 100644 index 00000000..61d9d309 --- /dev/null +++ b/src/__tests__/components/advanced/classification/ClassificationAdaptiveTree.test.js @@ -0,0 +1,19 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import ClassificationAdaptiveTree + from '../../../../components/advanced/classification/ClassificationAdaptiveTree'; +import {TextField, SelectField, Checkbox} from 'react-md'; + +const onChange = jest.fn(); + +describe('Classification Adaptive tree result', () => { + it('Data loaded', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(TextField).length).toBe(4); + expect(element.find(SelectField).length).toBe(2); + expect(element.find(Checkbox).length).toBe(4); + }); +}); diff --git a/src/__tests__/components/advanced/classification/ClassificationHoeffdingTree.test.js b/src/__tests__/components/advanced/classification/ClassificationHoeffdingTree.test.js new file mode 100644 index 00000000..28be53a8 --- /dev/null +++ b/src/__tests__/components/advanced/classification/ClassificationHoeffdingTree.test.js @@ -0,0 +1,19 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import ClassificationHoeffdingTree + from '../../../../components/advanced/classification/ClassificationHoeffdingTree'; +import {TextField, SelectField, Checkbox} from 'react-md'; + +const onChange = jest.fn(); + +describe('Classification Hoeffding tree result', () => { + it('Data loaded', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(TextField).length).toBe(4); + expect(element.find(SelectField).length).toBe(2); + expect(element.find(Checkbox).length).toBe(4); + }); +}); diff --git a/src/__tests__/components/advanced/classification/ClassificationNN.test.js b/src/__tests__/components/advanced/classification/ClassificationNN.test.js new file mode 100644 index 00000000..4483e696 --- /dev/null +++ b/src/__tests__/components/advanced/classification/ClassificationNN.test.js @@ -0,0 +1,18 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import ClassificationNN + from '../../../../components/advanced/classification/ClassificationNN'; +import {TextField, SelectField} from 'react-md'; + +const onChange = jest.fn(); + +describe('Classification Hoeffding tree result', () => { + it('Data loaded', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(TextField).length).toBe(4); + expect(element.find(SelectField).length).toBe(1); + }); +}); diff --git a/src/__tests__/components/advanced/classification/ClassificationNaiveBayes.test.js b/src/__tests__/components/advanced/classification/ClassificationNaiveBayes.test.js new file mode 100644 index 00000000..7c6e12de --- /dev/null +++ b/src/__tests__/components/advanced/classification/ClassificationNaiveBayes.test.js @@ -0,0 +1,18 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import ClassificationNaiveBayes + from '../../../../components/advanced/classification/ClassificationNaiveBayes'; +import {TextField, Checkbox} from 'react-md'; + +const onChange = jest.fn(); + +describe('ClassificationNaiveBayes result', () => { + it('Data loaded', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(TextField).length).toBe(1); + expect(element.find(Checkbox).length).toBe(1); + }); +}); diff --git a/src/__tests__/components/advanced/classification/ClassificationPerceptron.test.js b/src/__tests__/components/advanced/classification/ClassificationPerceptron.test.js new file mode 100644 index 00000000..bd2a3ba8 --- /dev/null +++ b/src/__tests__/components/advanced/classification/ClassificationPerceptron.test.js @@ -0,0 +1,19 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import ClassificationPerceptron + from '../../../../components/advanced/classification/ClassificationPerceptron'; +import {TextField, SelectField, Checkbox} from 'react-md'; + +const onChange = jest.fn(); + +describe('ClassificationPerceptron result', () => { + it('Data loaded', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(TextField).length).toBe(6); + expect(element.find(SelectField).length).toBe(1); + expect(element.find(Checkbox).length).toBe(3); + }); +}); diff --git a/src/__tests__/components/advanced/classification/ClassificationSGDClassifier.test.js b/src/__tests__/components/advanced/classification/ClassificationSGDClassifier.test.js new file mode 100644 index 00000000..eb635960 --- /dev/null +++ b/src/__tests__/components/advanced/classification/ClassificationSGDClassifier.test.js @@ -0,0 +1,19 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import ClassificationSGDClassifier + from '../../../../components/advanced/classification/ClassificationSGDClassifier'; +import {TextField, SelectField, Checkbox} from 'react-md'; + +const onChange = jest.fn(); + +describe('ClassificationSGDClassifier result', () => { + it('Data loaded', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(TextField).length).toBe(9); + expect(element.find(SelectField).length).toBe(3); + expect(element.find(Checkbox).length).toBe(3); + }); +}); diff --git a/src/__tests__/components/explanation/CfFeedback.test.js b/src/__tests__/components/explanation/CfFeedback.test.js index 257696db..8ccb07f9 100644 --- a/src/__tests__/components/explanation/CfFeedback.test.js +++ b/src/__tests__/components/explanation/CfFeedback.test.js @@ -1,11 +1,15 @@ import React from 'react'; import {shallow} from 'enzyme'; import CircularProgress from 'react-md/lib/Progress/CircularProgress'; -import {retrainResult, cfFeedbackResult} from '../../../../stories/Explanation'; +import {retrainResult, cfFeedbackResult, uniqueEncodedDecodedValues} from '../../../../stories/Explanation'; import CfFeedback from '../../../components/explanation/CfFeedback'; import RetrainResultTable from '../../../components/explanation/RetrainResultTable'; -import {TextField} from 'react-md'; +import {TextField, SelectField} from 'react-md'; +import CfFeedbackResulttTable from '../../../components/explanation/CfFeedbackResulttTable'; +import {getUniqueFeatureValues, getFeatureNames, encodePatternsForDropdown} from '../../../util/dataReducers'; +const onSubmitTopK = jest.fn(); +const onSubmitFeatureNamesAndValues = jest.fn(); describe('CfFeedback result', () => { it('All data loaded', () => { @@ -16,32 +20,46 @@ describe('CfFeedback result', () => { isRetrainValuesLoaded={true} isEncodedUniqueValuesLoaded={true} retrainValue={retrainResult} - featureNames={['Age', 'Prefix']} - featureValues={[{'Age': [1, 2]}, {'Prefix': [1, 2]}]} - onSubmitTopK={new function () {}} - onSubmitFeatureNamesAndValues={new function () {}}/>); + featureNames={getFeatureNames(uniqueEncodedDecodedValues)} + patterns={encodePatternsForDropdown(cfFeedbackResult[1])} + featureValues={getUniqueFeatureValues(uniqueEncodedDecodedValues)} + onSubmitTopK={onSubmitTopK} + onSubmitFeatureNamesAndValues={onSubmitFeatureNamesAndValues}/>); expect(element).toBeDefined(); + element.setState({numberOfDropdownFeatures: 1}); + element.setState({numberOfDropdownPatterns: 1}); + expect(element.find(TextField).length).toBe(1); - expect(element.find(TextField).at(0).props().min).toBe(0); + expect(element.find(CfFeedbackResulttTable).length).toBe(1); expect(element.find(RetrainResultTable).length).toBe(1); + expect(element.find(TextField).at(0).props().min).toBe(0); + expect(element.find(SelectField).length).toBe(3); expect(element.find(CircularProgress).length).toBe(0); }); - // it('None of the data loaded', () => { + it('None of the data loaded', () => { const element = shallow(); + retrainValue={retrainResult} + featureNames={getFeatureNames(uniqueEncodedDecodedValues)} + patterns={encodePatternsForDropdown(cfFeedbackResult[1])} + featureValues={getUniqueFeatureValues(uniqueEncodedDecodedValues)} + onSubmitTopK={onSubmitTopK} + onSubmitFeatureNamesAndValues={onSubmitFeatureNamesAndValues}/>); expect(element).toBeDefined(); + + element.setState({numberOfDropdownFeatures: 1}); + element.setState({numberOfDropdownPatterns: 1}); + expect(element.find(TextField).length).toBe(1); - expect(element.find(TextField).at(0).props().min).toBe(0); + expect(element.find(CfFeedbackResulttTable).length).toBe(1); expect(element.find(RetrainResultTable).length).toBe(1); + expect(element.find(TextField).at(0).props().min).toBe(0); + expect(element.find(SelectField).length).toBe(3); expect(element.find(CircularProgress).length).toBe(3); + }); }); diff --git a/src/__tests__/components/explanation/CfFeedbackResult.test.js b/src/__tests__/components/explanation/CfFeedbackResulttTable.test.js similarity index 50% rename from src/__tests__/components/explanation/CfFeedbackResult.test.js rename to src/__tests__/components/explanation/CfFeedbackResulttTable.test.js index e77a6c5f..073aa947 100644 --- a/src/__tests__/components/explanation/CfFeedbackResult.test.js +++ b/src/__tests__/components/explanation/CfFeedbackResulttTable.test.js @@ -1,21 +1,28 @@ import React from 'react'; import {shallow} from 'enzyme'; import {DataTable, TableBody, TableColumn, TableHeader, TablePagination, TableRow} from 'react-md/lib/DataTables/index'; -import CfFeedbackResultTable from '../../../components/explanation/CfFeedbackResultTable'; +import CfFeedbackResulttTable from '../../../components/explanation/CfFeedbackResulttTable'; import {cfFeedbackResult} from '../../../../stories/Explanation'; -import {parseCfFeedbackResult} from '../../../util/dataReducers'; +import {SelectField} from 'react-md'; + +const onSelectedMatrixChange = jest.fn(); describe('Cf feedback result Table', () => { it('renders', () => { - const element = shallow(); expect(element).toBeDefined(); expect(element.find(DataTable).length).toBe(1); + expect(element.find(SelectField).length).toBe(1); + expect(element.find(SelectField).at(0).props().defaultValue).toBe('All'); + expect(element.find(DataTable).at(0).find(TableRow).length).toBe(5); expect(element.find(DataTable).at(0).find(TableBody).find(TableRow).length).toBe(4); expect(element.find(DataTable).at(0).find(TableHeader) - .find(TableColumn).length).toBe(2); - expect(element.find(TablePagination).length).toBe(0); + .find(TableColumn).length).toBe(3); + expect(element.find(TablePagination).length).toBe(1); }); }); diff --git a/src/__tests__/components/static/HelpDialog.test.js b/src/__tests__/components/static/HelpDialog.test.js new file mode 100644 index 00000000..045ed4de --- /dev/null +++ b/src/__tests__/components/static/HelpDialog.test.js @@ -0,0 +1,31 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import HelpDialog + from '../../../components/static/HelpDialog'; +import {DialogContainer} from 'react-md'; + +const onChange = jest.fn(); + +describe('HelpDialog result', () => { + it('Visible item', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(DialogContainer).length).toBe(1); + expect(element.find(DialogContainer).at(0).props().visible).toBe(true); + }); + + it('Hide item', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(DialogContainer).length).toBe(1); + expect(element.find(DialogContainer).at(0).props().visible).toBe(false); + }); +}); diff --git a/src/__tests__/components/static/TimeSeriesPredictionMethodsCard.test.js b/src/__tests__/components/static/TimeSeriesPredictionMethodsCard.test.js new file mode 100644 index 00000000..c0a7c12f --- /dev/null +++ b/src/__tests__/components/static/TimeSeriesPredictionMethodsCard.test.js @@ -0,0 +1,41 @@ +import React from 'react'; +import {shallow} from 'enzyme'; +import TimeSeriesPredictionMethodsCard + from '../../../components/static/TimeSeriesPredictionMethodsCard'; +import {Card} from 'react-md/lib/Cards/index'; +import {Chart} from 'react-google-charts'; + + +const opts = { + hAxis: { + title: 'Time Series Prediction methods', + minValue: 0, + }, + vAxis: { + title: 'Time in seconds', + }, + chartArea: {width: '60%'}, + isStacked: false, +}; +const columns2 = [ + {type: 'string', label: 'Time Series Prediction method'}, + {type: 'number', label: 'Method time'}, + {type: 'string', role: 'annotation'}, +]; +const dataClass = [ + columns2, + ['Decision tree', 0.06, '0.06'], + ['Random forest', 0.39, '0.39'], + ['KNN', 4.60, '4.60'], +]; +describe('HelpDialog result', () => { + it('Visible item', () => { + const element = shallow(); + expect(element).toBeDefined(); + expect(element.find(Card).length).toBe(1); + expect(element.find(Chart).length).toBe(1); + expect(element.find(Chart).at(0).props().data.toString()).toBe(dataClass.toString()); + expect(element.find(Chart).at(0).props().options.toString()).toBe(opts.toString()); + }); +}); diff --git a/src/__tests__/util/labelCompare.test.js b/src/__tests__/util/labelCompare.test.js index 60d6a00b..cddb2de5 100644 --- a/src/__tests__/util/labelCompare.test.js +++ b/src/__tests__/util/labelCompare.test.js @@ -7,7 +7,8 @@ import { REGRESSION, REMAINING_TIME, THRESHOLD_CUSTOM, - THRESHOLD_MEAN + THRESHOLD_MEAN, + TIME_SERIES_PREDICTION } from '../../reference'; import {labelCompare} from '../../util/labelCompare'; @@ -17,6 +18,7 @@ const atrNum = {type: ATTRIBUTE_NUMBER, attribute_name: 'name'}; const regCompare = labelCompare(REGRESSION); const classCompare = labelCompare(CLASSIFICATION); // can also be labelling +const timeSeriesCompare = labelCompare(TIME_SERIES_PREDICTION); // can also be labelling it('false if wrong type', () => { const result = regCompare(remainingTime, atrNum); @@ -39,6 +41,26 @@ describe('Regression', () => { }); }); +describe('TimeSeries', () => { + describe('Duration', () => { + const durMean = {type: DURATION, threshold_type: THRESHOLD_MEAN}; + const durCustom = {type: DURATION, threshold_type: THRESHOLD_CUSTOM, threshold: 100}; + it('true if both threshold mean', () => { + expect(timeSeriesCompare(durMean, durMean)).toEqual(true); + }); + it('true if threshold custom with same threshold', () => { + expect(timeSeriesCompare(durCustom, durCustom)).toEqual(true); + }); + + it('false if different thresholds types or numbers', () => { + expect(timeSeriesCompare(durMean, durCustom)).toEqual(false); + const result = timeSeriesCompare(durCustom, {type: DURATION, threshold_type: THRESHOLD_CUSTOM, threshold: 2}); + expect(result).toEqual(false); + }); + }); +}); + + describe('Classification', () => { describe('Duration', () => { const durMean = {type: DURATION, threshold_type: THRESHOLD_MEAN}; diff --git a/src/actions/ServerActions.js b/src/actions/ServerActions.js index 5a5ec93b..e2cf6d2d 100644 --- a/src/actions/ServerActions.js +++ b/src/actions/ServerActions.js @@ -209,7 +209,7 @@ export const getIceValues = ({jobId, attribute}) => (dispatch) => { export const getCfFeedbackValues = ({jobId, attribute}) => (dispatch) => { jsonAjax( - SERVER_URL + `/explanation/cffeedback/${jobId}&${attribute}/`, + SERVER_URL + `/explanation/cffeedback/${71}&${attribute}/`, 'GET', null, (resul) => { @@ -219,11 +219,11 @@ export const getCfFeedbackValues = ({jobId, attribute}) => (dispatch) => { ); }; -export const getRetrainValues = ({jobId, featureNames, featureValues}) => (dispatch) => { +export const getRetrainValues = ({jobId, data}) => (dispatch) => { jsonAjax( - SERVER_URL + `/explanation/retrain/${jobId}&${featureNames}&${featureValues}/`, - 'GET', - null, + SERVER_URL + `/explanation/retrain/${71}/`, + 'POST', + data, (resul) => { dispatch(retrainValueListRetrieved(resul)); }, diff --git a/src/components/explanation/CfFeedback.js b/src/components/explanation/CfFeedback.js index ae36ff69..25cfe6f1 100644 --- a/src/components/explanation/CfFeedback.js +++ b/src/components/explanation/CfFeedback.js @@ -3,33 +3,58 @@ import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; import PropTypes from 'prop-types'; import CircularProgress from 'react-md/lib/Progress/CircularProgress'; import {TextField} from 'react-md'; -import CfFeedbackResultTable from './CfFeedbackResultTable'; +import CfFeedbackResulttTable from './CfFeedbackResulttTable'; import SelectField from 'react-md/lib/SelectFields'; import {Row} from 'react-grid-system'; import RetrainResultTable from './RetrainResultTable'; +import {getFeatureNamesAndValueFromSelectedPatterns} from '../../util/dataReducers'; class CfFeedback extends PureComponent { constructor(props) { super(props); - let removedIndex = []; - let numberOfDropdown = 0; + let removedIndexFeatures = []; + let removedIndexPatterns = []; + let numberOfDropdownFeatures = 0; + let numberOfDropdownPatterns = 0; + let shownDropdownsFeatures = 0; + let shownDropdownsPatterns = 0; + let selectedMatrix = 'All'; let featureNames = []; + let patterns = []; this.state = { - numberOfDropdown, - removedIndex, - featureNames + numberOfDropdownFeatures, + numberOfDropdownPatterns, + shownDropdownsFeatures, + shownDropdownsPatterns, + removedIndexFeatures, + removedIndexPatterns, + featureNames, + patterns, + selectedMatrix }; } onChangeFeatureName(value, index, event, data) { let i=0; let arr = this.state.featureNames; - for (i=0; i < this.state.numberOfDropdown; i++) { + for (i=0; i < this.state.numberOfDropdownFeatures; i++) { if (data.id == 'features_'+i) { arr[i] = data.value; } } this.setState({featureNames: arr}); - this.setState({removedIndex: this.state.removedIndex.concat(-2)}); + this.setState({removedIndexFeatures: this.state.removedIndexFeatures.concat(-2)}); + } + + onChangePattern(value, index, event, data) { + let i=0; + let arr = this.state.patterns; + for (i=0; i < this.state.numberOfDropdownPatterns; i++) { + if (data.id == 'patterns_'+i) { + arr[i] = data.value; + } + } + this.setState({patterns: arr}); + this.setState({removedIndexPatterns: this.state.removedIndexPatterns.concat(-2)}); } onChangeFeatureValue(id) { @@ -40,7 +65,7 @@ class CfFeedback extends PureComponent { this.onChangeFeatureValue(id)} @@ -65,6 +86,20 @@ class CfFeedback extends PureComponent { ); } + getPatternSelector(id) { + return ( + + ); + } + getInputText() { return ( ); } - plusButton(id) { + featureAddButton(id) { return ( ); + onClick={() => this.onFeatureAddClicked()} + >ADD); } - removeButton(id) { + featureRemoveButton(id) { return ( ); + onClick={() => this.onFeatureRemoveClicked(id)} + >REMOVE); + } + + patternAddButton(id) { + return ( + ); + } + patternRemoveButton(id) { + return ( + ); } submitTopKButton() { return ( @@ -118,7 +177,7 @@ class CfFeedback extends PureComponent { color: 'darkblue', borderRadius: 5, borderWidth: 1, borderColor: '#fff'}} onClick={() => this.onSubmitTopKClicked()} - >Sumbit); + >SUBMIT); } evaluateFeatureButton() { return ( @@ -128,18 +187,18 @@ class CfFeedback extends PureComponent { color: 'darkblue', borderRadius: 5, borderWidth: 1, borderColor: '#fff'}} onClick={() => this.onEvaluateFeatureClicked()} - >Evaluate); + >EVALUATE); } - addNewDropdowns() { + addNewFeatureDropdowns() { let i =0; let arr = []; - for (i=0; i < this.state.numberOfDropdown; i++) { - if (!this.state.removedIndex.includes(i)) { + for (i=0; i < this.state.numberOfDropdownFeatures; i++) { + if (!this.state.removedIndexFeatures.includes(i)) { arr.push(
    {this.getFeatureNamesSelector(i)} {this.getFeatureValuesSelector(i)} - {this.plusButton(i)} - {this.removeButton(i)} + {this.featureAddButton(i)} + {this.featureRemoveButton(i)}
    ); } else arr.push(null); @@ -150,12 +209,42 @@ class CfFeedback extends PureComponent {
    ); } - onPlusClicked() { - this.setState({numberOfDropdown: this.state.numberOfDropdown+1}); + addNewPatternDropdowns() { + let i =0; + let arr = []; + for (i=0; i < this.state.numberOfDropdownPatterns; i++) { + if (!this.state.removedIndexPatterns.includes(i)) { + arr.push(
    + {this.getPatternSelector(i)} + {this.patternAddButton(i)} + {this.patternRemoveButton(i)} +
    + ); + } else arr.push(null); + } + return ( +
    + {arr} +
    + ); + } + onFeatureAddClicked() { + this.setState({numberOfDropdownFeatures: this.state.numberOfDropdownFeatures+1}); this.setState({featureNames: this.state.featureNames.concat(null)}); + this.setState({shownDropdownsFeatures: this.state.shownDropdownsFeatures+1}); } - onRemoveClicked(index) { - this.setState({removedIndex: this.state.removedIndex.concat(index)}); + onFeatureRemoveClicked(index) { + this.setState({removedIndexFeatures: this.state.removedIndexFeatures.concat(index)}); + this.setState({shownDropdownsFeatures: this.state.shownDropdownsFeatures-1}); + } + onPatternAddClicked() { + this.setState({numberOfDropdownPatterns: this.state.numberOfDropdownPatterns+1}); + this.setState({patterns: this.state.patterns.concat(null)}); + this.setState({shownDropdownsPatterns: this.state.shownDropdownsPatterns+1}); + } + onPatternRemoveClicked(index) { + this.setState({removedIndexPatterns: this.state.removedIndexPatterns.concat(index)}); + this.setState({shownDropdownsPatterns: this.state.shownDropdownsPatterns-1}); } onSubmitTopKClicked() { if (document.getElementById('topK') != null && (document.getElementById('topK')).value>0) { @@ -164,18 +253,38 @@ class CfFeedback extends PureComponent { } onEvaluateFeatureClicked() { let i = 0; - let featureNames = []; - let featureValues = []; - for (i = 0; i0) { + let mergedResult = getFeatureNamesAndValueFromSelectedPatterns(prefixs, + this.props.featureNames, this.props.featureValues); + mergedResult.forEach(element => { + data.push(element); + }); + } + this.props.onSubmitFeatureNamesAndValues(data); } initialResult(result) { return ( @@ -191,14 +300,19 @@ class CfFeedback extends PureComponent { ); } + onSelectedMatrixChange(matrix) { + this.setState({selectedMatrix: matrix}); + } render() { - if (this.state.numberOfDropdown == 0) { - this.setState({numberOfDropdown: this.state.numberOfDropdown+1}); - this.setState({featureNames: this.state.featureNames.concat(null)}); + if (this.state.shownDropdownsFeatures == 0) { + this.onFeatureAddClicked(); + } + if (this.state.shownDropdownsPatterns == 0) { + this.onPatternAddClicked(); } return ( - +
    @@ -207,14 +321,19 @@ class CfFeedback extends PureComponent {
    {!this.props.isCfFeedbackValuesLoaded ? : null} - {this.drawLine()} -

    Patterns to randomise

    +

    Features and Patterns to randomize

    +

    Randomizing patterns that affect wrong predictions the accuracy of + the classifier could improve

    + {this.addNewPatternDropdowns()} {!this.props.isEncodedUniqueValuesLoaded ? : null} - {this.addNewDropdowns()} + {this.addNewFeatureDropdowns()} {!this.props.isRetrainValuesLoaded ? : null}
    {JSON.stringify(this.props.retrainValue) !='{}' ? @@ -237,6 +356,7 @@ CfFeedback.propTypes = { isRetrainValuesLoaded: PropTypes.bool, isEncodedUniqueValuesLoaded: PropTypes.bool, featureNames: PropTypes.any, + patterns: PropTypes.any, featureValues: PropTypes.any, onSubmitTopK: PropTypes.func, onSubmitFeatureNamesAndValues: PropTypes.func, diff --git a/src/components/explanation/CfFeedbackResultTable.js b/src/components/explanation/CfFeedbackResultTable.js deleted file mode 100644 index 47d62027..00000000 --- a/src/components/explanation/CfFeedbackResultTable.js +++ /dev/null @@ -1,51 +0,0 @@ -import React, {PureComponent} from 'react'; -import {DataTable, TableBody, TableColumn, TableHeader, TableRow} from 'react-md/lib/DataTables/index'; -import PropTypes from 'prop-types'; -import {columnStyle} from '../../reference'; - -class CfFeedbackResultTable extends PureComponent { - constructor(props) { - super(props); - } - getHeaderColumns() { - const headers = ['Matrix', 'Result']; - return ( - - - - {headers.map((header) => {header})} - - - - - {'tp'} - {this.props.cfFeedbackResult['tp'].toString()} - - - {'tn'} - {this.props.cfFeedbackResult['tn'].toString()} - - - {'fp'} - {this.props.cfFeedbackResult['fp'].toString()} - - - {'fn'} - {this.props.cfFeedbackResult['fn'].toString()} - - - - ); - } - render() { - return
    - {this.getHeaderColumns()} -
    ; - } -} - -CfFeedbackResultTable.propTypes = { - cfFeedbackResult: PropTypes.any, -}; - -export default CfFeedbackResultTable; diff --git a/src/components/explanation/CfFeedbackResulttTable.js b/src/components/explanation/CfFeedbackResulttTable.js new file mode 100644 index 00000000..aa3b32b2 --- /dev/null +++ b/src/components/explanation/CfFeedbackResulttTable.js @@ -0,0 +1,114 @@ +import React, {PureComponent} from 'react'; +import {DataTable, TableBody, TableColumn, TableHeader, TablePagination, TableRow} from 'react-md/lib/DataTables/index'; +import PropTypes from 'prop-types'; +import {getPatternsForMatrix, getConfusionMatrixLabels} from '../../util/dataReducers'; +import {SelectField} from 'react-md'; + +class CfFeedbackResulttTable extends PureComponent { + constructor(props) { + super(props); + this.state = { + features: getPatternsForMatrix(this.props.cfFeedbackResult, this.props.selectedMatrix).slice(0, 10), + }; + } + + handlePagination(start, rowsPerPage) { + this.setState({ + features: getPatternsForMatrix(this.props.cfFeedbackResult, this.props.selectedMatrix) + .slice(start, start + rowsPerPage) + }); + } + + componentDidUpdate(prevProps) { + if (prevProps.selectedMatrix !== this.props.selectedMatrix + || prevProps.cfFeedbackResult !== this.props.cfFeedbackResult ) { + this.setState({features: getPatternsForMatrix(this.props.cfFeedbackResult, + this.props.selectedMatrix).slice(0, 10)}); + } + } + + getHeaderColumns(headers) { + return headers.map(header => { + let grow = false; + if (header === 'Configuration') { + grow = true; + } + return ( + + {' '} + {header} + + ); + }); + } + + getConfusionMatrixTable(values) { + return ( + + + + {this.getHeaderColumns(['Matrix', 'Pattern', 'Value'])} + + + + {values.map( + (value, index) => ( + + {value.map( + (v) => ( + {v} + ) + )} + + ) + )} + + + + ); + } + + getMatrixSelector() { + return ( + + ); + } + + onChangeMatrix(value, index, event, data) { + this.props.onSelectedMatrixChange(value); + } + + render() { + return
    +

    Confusion matrix filter

    + {this.getMatrixSelector()} + {this.getConfusionMatrixTable(this.state.features)} +
    ; + } +} + +CfFeedbackResulttTable.propTypes = { + cfFeedbackResult: PropTypes.array.isRequired, + onSelectedMatrixChange: PropTypes.func, + selectedMatrix: PropTypes.any, +}; + +export default CfFeedbackResulttTable; diff --git a/src/components/static/TimeSeriesPredictionMethodsCard.js b/src/components/static/TimeSeriesPredictionMethodsCard.js index 589c297a..2495c829 100644 --- a/src/components/static/TimeSeriesPredictionMethodsCard.js +++ b/src/components/static/TimeSeriesPredictionMethodsCard.js @@ -57,3 +57,5 @@ export const TimeSeriesPredictionMethodsCard = () => { // TODO: update ; }; +export default TimeSeriesPredictionMethodsCard; + diff --git a/src/reducers/Explanation.js b/src/reducers/Explanation.js index 198e4f83..6a972bdd 100644 --- a/src/reducers/Explanation.js +++ b/src/reducers/Explanation.js @@ -120,7 +120,7 @@ const explanation = (state = initialState, action) => { } case SKATER_VALUE_LIST_FAILED: { - const skaterValueList = initialState.limeValueList; + const skaterValueList = initialState.skaterValueList; return { ...state, fetchState: {inFlight: false, error: action.payload}, @@ -149,7 +149,7 @@ const explanation = (state = initialState, action) => { } case ICE_VALUE_LIST_FAILED: { - const iceValueList = initialState.limeValueList; + const iceValueList = initialState.iceValueList; return { ...state, fetchState: {inFlight: false, error: action.payload}, diff --git a/src/util/dataReducers.js b/src/util/dataReducers.js index 27d9a4be..43e75969 100644 --- a/src/util/dataReducers.js +++ b/src/util/dataReducers.js @@ -297,18 +297,6 @@ export const parseICEResult = (iceResult) => { return ({labels: labels, values: values, count: count}); }; -export const parseFairMLResult = (iceResult) => { - let labels = []; - let values = []; - let count = []; - for (let j = 0; j < iceResult.length; j++) { - labels.push(iceResult[j].label); - values.push(iceResult[j].value).toFixed(2); - count.push(iceResult[j].count | 0); - } - return ({labels: labels, values: values, count: count}); -}; - export const parseTemporalStabilityLimeResultList = (predictionList, traceId) => { let data = [[]]; let prefixs = []; @@ -460,11 +448,183 @@ export const getUniqueFeatureValues = (dfResult) =>{ }; export const parseCfFeedbackResult = (result) =>{ - let keys = Object.keys(result); - - if (keys.length>0) { - return {'tp': result['freq_seqs_after_filter']['tp'], 'tn': result['freq_seqs_after_filter']['tn'], - 'fp': result['freq_seqs_after_filter']['fp'], 'fn': result['freq_seqs_after_filter']['fn']}; + if (JSON.stringify(result) != '{}') { + let keys = Object.keys(result['freq_seqs_after_filter']); + if (keys.length>0) { + return {'tp': result['freq_seqs_after_filter']['tp'], 'tn': result['freq_seqs_after_filter']['tn'], + 'fp': result['freq_seqs_after_filter']['fp'], 'fn': result['freq_seqs_after_filter']['fn']}; + } } return {'tp': '', 'tn': '', 'fp': '', 'fn': ''}; }; + +export const getUniquePatterns = (result) =>{ + let resultArray = new Set(); + let i = 0; + let j = 0; + let k = 0; + if (result == null) return []; + else { + let keys = Object.keys(result['freq_seqs_after_filter']); + for (i=0; i0 ) { + for (j=0; j{ + let resultArray = []; + let i = 0; + let j = 0; + let k = 0; + if (JSON.stringify(result) != '{}') { + const uniquePatterns = encodePatternsForDropdown(result); + if (matrixName == 'All') { + let keys = Object.keys(result['freq_seqs_after_filter']); + for (i=0; i0 ) { + for (j=0; j { + let split = element.split(':'); + if (element.split(split[0]+':')[1]==patterns) { + arr.push(element); + } + }); + arr.push(result['freq_seqs_after_filter'][keys[i]][j][1]); + resultArray.push(arr); + } + } + } + } else { + matrixName = getAbrebiationConfusionMatrixName(matrixName); + if (result['freq_seqs_after_filter'][matrixName].length>0 ) { + for (j=0; j { + if (element==patterns) { + arr.push(patterns); + } + }); + arr.push(result['freq_seqs_after_filter'][matrixName][j][1]); + resultArray.push(arr); + } + } + } + } + return resultArray; +}; + +const getConfusionMatrixName = (key) => { + if (key == 'tp') return 'True Positive'; + if (key == 'tn') return 'True Negative'; + if (key == 'fp') return 'False Positive'; + if (key == 'fn') return 'False Negative'; + return null; +}; + +const getAbrebiationConfusionMatrixName = (key) => { + if (key == 'True Positive') return 'tp'; + if (key == 'True Negative') return 'tn'; + if (key == 'False Positive') return 'fp'; + if (key == 'False Negative') return 'fn'; + if (key == 'All') return 'All'; + return null; +}; + +export const encodePatternsForDropdown = (result) =>{ + let resultArray = []; + if (JSON.stringify(result) != '{}') { + const uniquePatterns = getUniquePatterns(result); + let i = 0; + for (i=0; i{ + if (JSON.stringify(result) != '{}') { + let labels = []; + let keys = Object.keys(result['freq_seqs_after_filter']); + keys.forEach(element => { + labels.push(getConfusionMatrixName(element)); + }); + if (labels.length>0) return ['All'].concat(labels); + } + return []; +}; + +export const decodePatterns = (length, encodedPatternList) =>{ + let i = 0; + let resultArray = []; + for (i=0; i=2) { + resultArray.push(encodedPatternList[i].split(lst[0])[1]); + } + } + return resultArray; +}; + +export const getFeatureNamesAndValueFromSelectedPatterns = (decodedSelectedPatterns, featureNames, featureValues) =>{ + let i = 0; + let j = 0; + let k = 0; + let resultArray = []; + for (i=0; i { + A: { + for (j=0; j
    @@ -416,8 +415,8 @@ const mapDispatchToProps = (dispatch) => ({ onRequestLimeTemporalList: (jobId, traceId) => dispatch(temporalLimePredictionListRequested({jobId, traceId})), onRequestCfFeedbackValues: (jobId, attribute) => dispatch(cffeedbackValueListRequested({jobId, attribute})), - onRequestRetrainValues: (jobId, featureNames, featureValues) => - dispatch(retrainValueListRequested({jobId, featureNames, featureValues})), + onRequestRetrainValues: (jobId, data) => + dispatch(retrainValueListRequested({jobId, data})), onRequestFailLimeValues: () => dispatch(limeValueListFailed(null)), onRequestFailShapValues: () => dispatch(shapValueListFailed(null)), onRequestFailIceValues: () => dispatch(iceValueListFailed(null)), diff --git a/src/views/Validation/Validation.js b/src/views/Validation/Validation.js index 616387d2..90523bdb 100644 --- a/src/views/Validation/Validation.js +++ b/src/views/Validation/Validation.js @@ -36,11 +36,11 @@ class Validation extends Component { } componentDidMount() { - if (this.props.jobs.length === 0) { - this.props.onRequestLogList(); - this.props.onRequestSplitList(); - this.props.onRequestJobs(); - } + // if (this.props.jobs.length === 0) { + // this.props.onRequestLogList(); + // this.props.onRequestSplitList(); + // this.props.onRequestJobs(); + // } ReactGA.initialize('UA-143444044-1'); ReactGA.pageview(window.location.hash); } diff --git a/stories/Explanation.js b/stories/Explanation.js index ca21032d..1254efdf 100644 --- a/stories/Explanation.js +++ b/stories/Explanation.js @@ -134,6 +134,16 @@ export const skaterResult = [ '' ]; +export const uniqueEncodedDecodedValues = { + 'prefix_1': { + 'inwend.geneesk. Out-year card costs': 0, + 'outpatient follow-up consultation': 1 + }, + 'prefix_2': { + 'outpatient follow-up consultation': 0, + 'Milk acid dehydrogenase LDH kinetic': 1 + } +} export const cfFeedbackResult =[ 'False', { From f07e3874546fea207ea89f823cd3a2cd75b0cd45 Mon Sep 17 00:00:00 2001 From: Musacca Date: Sun, 19 Apr 2020 14:13:58 +0300 Subject: [PATCH 22/29] increase test coverage --- .codecov.yml | 6 +++--- src/actions/ServerActions.js | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.codecov.yml b/.codecov.yml index 4e00dee4..195dcba2 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -9,7 +9,7 @@ ignore: - "src/views/Labelling.js" - "src/components/upload/ServerUpload.jsx" - "src/components/upload/UploadDouble.jsx" - - "src/components/advanced/Checkbox.js - - "src/components/advanced/Incremental.js - - "src/components/advanced/IncrementalTable.js + - "src/components/advanced/Checkbox.js" + - "src/components/advanced/Incremental.js" + - "src/components/advanced/IncrementalTable.js" - "src/components/prediction/**/*.js" diff --git a/src/actions/ServerActions.js b/src/actions/ServerActions.js index e2cf6d2d..70ce5277 100644 --- a/src/actions/ServerActions.js +++ b/src/actions/ServerActions.js @@ -209,7 +209,7 @@ export const getIceValues = ({jobId, attribute}) => (dispatch) => { export const getCfFeedbackValues = ({jobId, attribute}) => (dispatch) => { jsonAjax( - SERVER_URL + `/explanation/cffeedback/${71}&${attribute}/`, + SERVER_URL + `/explanation/cffeedback/${jobId}&${attribute}/`, 'GET', null, (resul) => { @@ -221,7 +221,7 @@ export const getCfFeedbackValues = ({jobId, attribute}) => (dispatch) => { export const getRetrainValues = ({jobId, data}) => (dispatch) => { jsonAjax( - SERVER_URL + `/explanation/retrain/${71}/`, + SERVER_URL + `/explanation/retrain/${jobId}/`, 'POST', data, (resul) => { From daa00a372ab823a8dcc44345e4fdccda98b487f7 Mon Sep 17 00:00:00 2001 From: Musacca Date: Sun, 19 Apr 2020 14:21:35 +0300 Subject: [PATCH 23/29] increase test coverage --- .codecov.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.codecov.yml b/.codecov.yml index 195dcba2..85482c4e 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -5,11 +5,9 @@ ignore: - "src/middlewares/WebSocketMiddleware.js" - "src/reducers/index.js" - "src/views/**/*.js" - - "src/views/Split.js" - - "src/views/Labelling.js" - "src/components/upload/ServerUpload.jsx" - "src/components/upload/UploadDouble.jsx" - "src/components/advanced/Checkbox.js" - "src/components/advanced/Incremental.js" - "src/components/advanced/IncrementalTable.js" - - "src/components/prediction/**/*.js" + - "src/components/prediction/*.js" From 93efa3f8a334d177e94edc722752d5bd2ed0e155 Mon Sep 17 00:00:00 2001 From: Musacca Date: Sun, 19 Apr 2020 14:57:22 +0300 Subject: [PATCH 24/29] increase test coverage --- .codecov.yml | 3 +-- src/__tests__/util/dataReducers.test.js | 22 +++++++++++++++++++--- stories/Explanation.js | 3 ++- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/.codecov.yml b/.codecov.yml index 85482c4e..02ac4a74 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -9,5 +9,4 @@ ignore: - "src/components/upload/UploadDouble.jsx" - "src/components/advanced/Checkbox.js" - "src/components/advanced/Incremental.js" - - "src/components/advanced/IncrementalTable.js" - - "src/components/prediction/*.js" + - "src/components/advanced/IncrementalTable.js" \ No newline at end of file diff --git a/src/__tests__/util/dataReducers.test.js b/src/__tests__/util/dataReducers.test.js index 59a25e0c..2149c5b1 100644 --- a/src/__tests__/util/dataReducers.test.js +++ b/src/__tests__/util/dataReducers.test.js @@ -1,9 +1,10 @@ /** * Created by tonis.kasekamp on 10/17/17. */ -import {makeLabels, makeTable, parseLimeResult, getTraceAttributes, getTraceIdsFromLogs} from '../../util/dataReducers'; +import {makeLabels, makeTable, parseLimeResult, getTraceAttributes, + getTraceIdsFromLogs, getUniqueFeatureValues, getFeatureNames } from '../../util/dataReducers'; import {regJobs} from '../../../stories/LineChart'; -import {limeList, traceList} from '../../../stories/Explanation'; +import {limeList, traceList, uniqueEncodedDecodedValues} from '../../../stories/Explanation'; import {log} from '../../../stories/Logs'; @@ -63,4 +64,19 @@ describe('generates data for prefix chart', () => { const traceIds = getTraceIdsFromLogs({'1': log}, '1'); expect(traceIds.length).toEqual(4); }); -}); + + it('getUniqueFeatureValues ', () => { + const uniqueValues = getUniqueFeatureValues(uniqueEncodedDecodedValues); + expect(uniqueValues['encodedResult']['prefix_1']).toEqual([0, 1]); + expect(uniqueValues['encodedResult']['prefix_2']).toEqual([0, 1]); + expect(uniqueValues['decodedResult']['prefix_1']).toEqual(['inwend.geneesk. Out-year card costs', 'outpatient follow-up consultation']); + expect(uniqueValues['decodedResult']['prefix_2']).toEqual(['outpatient follow-up consultation', 'Milk acid dehydrogenase LDH kinetic']);}); + }); + + it('getFeatureNames', () => { + const featureNames = getFeatureNames(uniqueEncodedDecodedValues); + expect(featureNames.length).toEqual(2); + expect(featureNames.toString()).toEqual('prefix_1,prefix_2'); + }); + + diff --git a/stories/Explanation.js b/stories/Explanation.js index 1254efdf..4568be44 100644 --- a/stories/Explanation.js +++ b/stories/Explanation.js @@ -143,7 +143,8 @@ export const uniqueEncodedDecodedValues = { 'outpatient follow-up consultation': 0, 'Milk acid dehydrogenase LDH kinetic': 1 } -} +}; + export const cfFeedbackResult =[ 'False', { From 6a682cbace6f03e45b1490531a97ed045af76c97 Mon Sep 17 00:00:00 2001 From: Musacca Date: Sun, 19 Apr 2020 15:08:47 +0300 Subject: [PATCH 25/29] increase test coverage --- .codecov.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.codecov.yml b/.codecov.yml index 02ac4a74..0b037382 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -4,6 +4,8 @@ ignore: - "src/actions/WebSocket.js" - "src/middlewares/WebSocketMiddleware.js" - "src/reducers/index.js" + - "src/views/Split.js" + - "src/views/Labelling.js" - "src/views/**/*.js" - "src/components/upload/ServerUpload.jsx" - "src/components/upload/UploadDouble.jsx" From fe35de28d8571ed81f9ca70610867bea8fd6e43c Mon Sep 17 00:00:00 2001 From: Musacca Date: Sun, 19 Apr 2020 15:25:18 +0300 Subject: [PATCH 26/29] increase test coverage --- src/__tests__/util/dataReducers.test.js | 7 +++---- src/views/Explanation/Explanation.js | 18 +++++++++--------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/__tests__/util/dataReducers.test.js b/src/__tests__/util/dataReducers.test.js index 2149c5b1..0ffa8312 100644 --- a/src/__tests__/util/dataReducers.test.js +++ b/src/__tests__/util/dataReducers.test.js @@ -2,7 +2,7 @@ * Created by tonis.kasekamp on 10/17/17. */ import {makeLabels, makeTable, parseLimeResult, getTraceAttributes, - getTraceIdsFromLogs, getUniqueFeatureValues, getFeatureNames } from '../../util/dataReducers'; + getTraceIdsFromLogs, getUniqueFeatureValues, getFeatureNames} from '../../util/dataReducers'; import {regJobs} from '../../../stories/LineChart'; import {limeList, traceList, uniqueEncodedDecodedValues} from '../../../stories/Explanation'; import {log} from '../../../stories/Logs'; @@ -70,7 +70,7 @@ describe('generates data for prefix chart', () => { expect(uniqueValues['encodedResult']['prefix_1']).toEqual([0, 1]); expect(uniqueValues['encodedResult']['prefix_2']).toEqual([0, 1]); expect(uniqueValues['decodedResult']['prefix_1']).toEqual(['inwend.geneesk. Out-year card costs', 'outpatient follow-up consultation']); - expect(uniqueValues['decodedResult']['prefix_2']).toEqual(['outpatient follow-up consultation', 'Milk acid dehydrogenase LDH kinetic']);}); + expect(uniqueValues['decodedResult']['prefix_2']).toEqual(['outpatient follow-up consultation', 'Milk acid dehydrogenase LDH kinetic']); }); it('getFeatureNames', () => { @@ -78,5 +78,4 @@ describe('generates data for prefix chart', () => { expect(featureNames.length).toEqual(2); expect(featureNames.toString()).toEqual('prefix_1,prefix_2'); }); - - +}); diff --git a/src/views/Explanation/Explanation.js b/src/views/Explanation/Explanation.js index fb97df51..2f129f23 100644 --- a/src/views/Explanation/Explanation.js +++ b/src/views/Explanation/Explanation.js @@ -109,16 +109,16 @@ class Explanation extends Component { onChangeJob(id) { this.props.onJobChange(id); - // if (this.props.selectedTrace !== '') { - // this.props.onRequestLimeValues(id, this.props.selectedTrace); - // this.props.onRequestLimeTemporalList(id, this.props.selectedTrace); - // this.props.onRequestPredictionTemporalList(id, this.props.selectedTrace); - // this.props.onRequestShapValues(id, this.props.selectedTrace); - // } - // this.props.onRequestSkaterValues(id); - // this.props.onRequestDecoding(id); + if (this.props.selectedTrace !== '') { + this.props.onRequestLimeValues(id, this.props.selectedTrace); + this.props.onRequestLimeTemporalList(id, this.props.selectedTrace); + this.props.onRequestPredictionTemporalList(id, this.props.selectedTrace); + this.props.onRequestShapValues(id, this.props.selectedTrace); + } + this.props.onRequestSkaterValues(id); + this.props.onRequestDecoding(id); this.props.onRequestEncodeUniqueValuesDF(id); - // this.props.onRequestIceValues(id, this.state.selectedAttribute); + this.props.onRequestIceValues(id, this.state.selectedAttribute); } componentDidMount() { From b3c95a0f4336410ab9c7bc494848188111428482 Mon Sep 17 00:00:00 2001 From: Musacca Date: Sun, 19 Apr 2020 18:01:38 +0300 Subject: [PATCH 27/29] small fix --- .vscode/launch.json | 20 ----- ....test.js => CfFeedbackResultTable.test.js} | 4 +- ...sulttTable.js => CfFeedbackResultTable.js} | 6 +- src/util/dataReducers.js | 80 ++++++++++--------- 4 files changed, 46 insertions(+), 64 deletions(-) delete mode 100644 .vscode/launch.json rename src/__tests__/components/explanation/{CfFeedbackResulttTable.test.js => CfFeedbackResultTable.test.js} (89%) rename src/components/explanation/{CfFeedbackResulttTable.js => CfFeedbackResultTable.js} (96%) diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 389a6188..00000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "node", - "request": "launch", - "name": "Launch Program", - "skipFiles": [ - "/**" - ], - "program": "${workspaceFolder}\\start", - "outFiles": [ - "${workspaceFolder}/**/*.js" - ] - } - ] -} \ No newline at end of file diff --git a/src/__tests__/components/explanation/CfFeedbackResulttTable.test.js b/src/__tests__/components/explanation/CfFeedbackResultTable.test.js similarity index 89% rename from src/__tests__/components/explanation/CfFeedbackResulttTable.test.js rename to src/__tests__/components/explanation/CfFeedbackResultTable.test.js index 073aa947..f82fa3fd 100644 --- a/src/__tests__/components/explanation/CfFeedbackResulttTable.test.js +++ b/src/__tests__/components/explanation/CfFeedbackResultTable.test.js @@ -1,7 +1,7 @@ import React from 'react'; import {shallow} from 'enzyme'; import {DataTable, TableBody, TableColumn, TableHeader, TablePagination, TableRow} from 'react-md/lib/DataTables/index'; -import CfFeedbackResulttTable from '../../../components/explanation/CfFeedbackResulttTable'; +import CfFeedbackResultTable from '../../../components/explanation/CfFeedbackResultTable'; import {cfFeedbackResult} from '../../../../stories/Explanation'; import {SelectField} from 'react-md'; @@ -9,7 +9,7 @@ const onSelectedMatrixChange = jest.fn(); describe('Cf feedback result Table', () => { it('renders', () => { - const element = shallow( { - let i; let j; + let i; + let j; let allValues =[]; for (j = 0; j < columnNames.length; j++) { if (columnNames[j] != 'All') { @@ -235,13 +236,13 @@ export const getRadarChartValuesForAllColumns = ( for (i = 0; i < radarCharLabels.length; i++) { const radarChartObject = radarChartObjects[i]; if (isNaN(Number(prefixLengthValue))) { - radarChartDatas.push(getAverage(radarChartObject, j+1)); + radarChartDatas.push(getAverage(radarChartObject, j + 1)); } else { radarChartDatas.push( getValueForColumnName( radarChartObject, prefixLengthValue, - j+1 + j + 1 ) ); } @@ -347,15 +348,14 @@ export const parseTemporalStabilityPredictionResultList = (predictionList, trace }; export const getTraceAttributes = (traceList, selectedTrace) =>{ - let i=0; + let i = 0; if (traceList === undefined) { traceList = []; } let traceAttributesHeader = getTraceAttributesHeader(traceList); let traceEventsHeaders = getTraceEventsHeader(traceList); let traceArr = {'attributes': [], 'events': []}; - i=0; - for (i =0; i{ }; const getTraceAttributesHeader = (traceList) =>{ - let i=0; + let i = 0; let traceAttributesHeader = []; - for (i =0; i{ const getTraceEventsHeader = (traceList) =>{ - let i=0; + let i = 0; let traceEventsHeaders = []; - for (i =0; i{ export const getIceResultListTable = (iceResultList) =>{ - let i=0; + let i = 0; let result = []; - for (i = 0; i{ }; export const getDecodedDFTable = (dfResult) =>{ - let i=0; let j=0; + let i = 0; + let j = 0; let result = []; let keys = Object.keys(dfResult); - if (keys.length>0) { + if (keys.length > 0) { for (j = 0; j < dfResult[keys[0]].length; j++) { let arr = []; arr.push(j+1); - for (i = 0; i{ }; export const getUniqueFeatureValues = (dfResult) =>{ - let i=0; let j=0; + let i = 0; + let j = 0; let encodedResult = {}; let decodedResult = {}; let keys = Object.keys(dfResult); if (keys.length>0) { - for (i = 0; i{ if (result == null) return []; else { let keys = Object.keys(result['freq_seqs_after_filter']); - for (i=0; i0 ) { - for (j=0; j 0 ) { + for (j = 0; j < result['freq_seqs_after_filter'][keys[i]].length; j++) { let patterns = ''; - for (k=0; k{ const uniquePatterns = encodePatternsForDropdown(result); if (matrixName == 'All') { let keys = Object.keys(result['freq_seqs_after_filter']); - for (i=0; i0 ) { - for (j=0; j { @@ -532,16 +534,16 @@ export const getPatternsForMatrix = (result, matrixName) =>{ } } else { matrixName = getAbrebiationConfusionMatrixName(matrixName); - if (result['freq_seqs_after_filter'][matrixName].length>0 ) { - for (j=0; j 0 ) { + for (j = 0; j < result['freq_seqs_after_filter'][matrixName].length; j++) { let arr = []; arr.push(getConfusionMatrixName(matrixName)); let patterns = ''; - for (k=0; k { @@ -580,7 +582,7 @@ export const encodePatternsForDropdown = (result) =>{ if (JSON.stringify(result) != '{}') { const uniquePatterns = getUniquePatterns(result); let i = 0; - for (i=0; i{ export const decodePatterns = (length, encodedPatternList) =>{ let i = 0; let resultArray = []; - for (i=0; i=2) { + if (lst.length >= 2) { resultArray.push(encodedPatternList[i].split(lst[0])[1]); } } @@ -616,14 +618,14 @@ export const getFeatureNamesAndValueFromSelectedPatterns = (decodedSelectedPatte let j = 0; let k = 0; let resultArray = []; - for (i=0; i { A: { - for (j=0; j Date: Sat, 25 Apr 2020 20:48:38 +0300 Subject: [PATCH 28/29] small design changes --- src/__tests__/components/explanation/CfFeedback.test.js | 6 +++--- src/components/chart/HorizontalBarChartCard.js | 2 +- src/components/chart/PredictionLineChart.js | 2 +- src/components/explanation/CfFeedback.js | 4 ++-- src/components/explanation/CfFeedbackResultTable.js | 2 +- src/components/explanation/post_hoc.js | 2 +- src/reducers/Explanation.js | 6 ++++++ 7 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/__tests__/components/explanation/CfFeedback.test.js b/src/__tests__/components/explanation/CfFeedback.test.js index 8ccb07f9..108dec6f 100644 --- a/src/__tests__/components/explanation/CfFeedback.test.js +++ b/src/__tests__/components/explanation/CfFeedback.test.js @@ -5,7 +5,7 @@ import {retrainResult, cfFeedbackResult, uniqueEncodedDecodedValues} from '../.. import CfFeedback from '../../../components/explanation/CfFeedback'; import RetrainResultTable from '../../../components/explanation/RetrainResultTable'; import {TextField, SelectField} from 'react-md'; -import CfFeedbackResulttTable from '../../../components/explanation/CfFeedbackResulttTable'; +import CfFeedbackResultTable from '../../../components/explanation/CfFeedbackResultTable'; import {getUniqueFeatureValues, getFeatureNames, encodePatternsForDropdown} from '../../../util/dataReducers'; const onSubmitTopK = jest.fn(); @@ -30,7 +30,7 @@ describe('CfFeedback result', () => { element.setState({numberOfDropdownPatterns: 1}); expect(element.find(TextField).length).toBe(1); - expect(element.find(CfFeedbackResulttTable).length).toBe(1); + expect(element.find(CfFeedbackResultTable).length).toBe(1); expect(element.find(RetrainResultTable).length).toBe(1); expect(element.find(TextField).at(0).props().min).toBe(0); expect(element.find(SelectField).length).toBe(3); @@ -56,7 +56,7 @@ describe('CfFeedback result', () => { element.setState({numberOfDropdownPatterns: 1}); expect(element.find(TextField).length).toBe(1); - expect(element.find(CfFeedbackResulttTable).length).toBe(1); + expect(element.find(CfFeedbackResultTable).length).toBe(1); expect(element.find(RetrainResultTable).length).toBe(1); expect(element.find(TextField).at(0).props().min).toBe(0); expect(element.find(SelectField).length).toBe(3); diff --git a/src/components/chart/HorizontalBarChartCard.js b/src/components/chart/HorizontalBarChartCard.js index e596977b..bce97f85 100644 --- a/src/components/chart/HorizontalBarChartCard.js +++ b/src/components/chart/HorizontalBarChartCard.js @@ -74,7 +74,7 @@ class HorizontalBarChartCard extends React.Component { /> ); - return
    {this.props.data.length === 0 ? '' : chart}
    ; + return
    {this.props.data.length === 0 || this.props.labels.length === 0 ? '' : chart}
    ; } } diff --git a/src/components/chart/PredictionLineChart.js b/src/components/chart/PredictionLineChart.js index e1c3cdd5..776e22ff 100644 --- a/src/components/chart/PredictionLineChart.js +++ b/src/components/chart/PredictionLineChart.js @@ -51,7 +51,7 @@ class PredictionLineChart extends React.Component { }, labels: { formatter: function (val, i) { - return val; + return val.toFixed(2); } } }, diff --git a/src/components/explanation/CfFeedback.js b/src/components/explanation/CfFeedback.js index 25cfe6f1..13c523f9 100644 --- a/src/components/explanation/CfFeedback.js +++ b/src/components/explanation/CfFeedback.js @@ -3,7 +3,7 @@ import {Card, CardTitle, CardText} from 'react-md/lib/Cards/index'; import PropTypes from 'prop-types'; import CircularProgress from 'react-md/lib/Progress/CircularProgress'; import {TextField} from 'react-md'; -import CfFeedbackResulttTable from './CfFeedbackResulttTable'; +import CfFeedbackResultTable from './CfFeedbackResultTable'; import SelectField from 'react-md/lib/SelectFields'; import {Row} from 'react-grid-system'; import RetrainResultTable from './RetrainResultTable'; @@ -321,7 +321,7 @@ class CfFeedback extends PureComponent {
{!this.props.isCfFeedbackValuesLoaded ? : null} - - {this.getHeaderColumns(['Matrix', 'Pattern', 'Value'])} + {this.getHeaderColumns(['Class', 'Pattern', 'Frequency'])} diff --git a/src/components/explanation/post_hoc.js b/src/components/explanation/post_hoc.js index 9b8b4131..dd02a8af 100644 --- a/src/components/explanation/post_hoc.js +++ b/src/components/explanation/post_hoc.js @@ -22,7 +22,7 @@ const PostHocExplanation = (props) => { {!props.isLimeValuesLoaded ? : null}
- {props.limeValueList.values.length > 0 ? horizontalBarChart : null} + {horizontalBarChart}
; diff --git a/src/reducers/Explanation.js b/src/reducers/Explanation.js index 3bb1c8fa..50cfabb0 100644 --- a/src/reducers/Explanation.js +++ b/src/reducers/Explanation.js @@ -46,6 +46,7 @@ const explanation = (state = initialState, action) => { case LIME_VALUE_LIST_REQUESTED: { return { ...state, + limeValueList: {}, fetchState: {inFlight: true}, isLimeValuesLoaded: false, @@ -75,6 +76,7 @@ const explanation = (state = initialState, action) => { case SHAP_VALUE_LIST_REQUESTED: { return { ...state, + shapValueList: {}, fetchState: {inFlight: true}, isShapValuesLoaded: false, @@ -104,6 +106,7 @@ const explanation = (state = initialState, action) => { case SKATER_VALUE_LIST_REQUESTED: { return { ...state, + skaterValueList: {}, fetchState: {inFlight: true}, isSkaterValuesLoaded: false, @@ -133,6 +136,7 @@ const explanation = (state = initialState, action) => { case ICE_VALUE_LIST_REQUESTED: { return { ...state, + iceValueList: {}, fetchState: {inFlight: true}, isIceValuesLoaded: false, @@ -162,6 +166,7 @@ const explanation = (state = initialState, action) => { case CFFEEDBACK_VALUE_LIST_REQUESTED: { return { ...state, + cfFeedbackValue: {}, fetchState: {inFlight: true}, isCfFeedbackLoaded: false, @@ -191,6 +196,7 @@ const explanation = (state = initialState, action) => { case RETRAIN_VALUE_LIST_REQUESTED: { return { ...state, + retrainValue: {}, fetchState: {inFlight: true}, isRetrainLoaded: false, From 42a26e5102da9adcdc63915a47801867d4963abe Mon Sep 17 00:00:00 2001 From: Musacca Date: Sat, 25 Apr 2020 21:02:42 +0300 Subject: [PATCH 29/29] small design changes --- .../components/chart/HorizontalBarChartCard.test.js | 6 +----- src/__tests__/components/explanation/post_hoc.test.js | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/__tests__/components/chart/HorizontalBarChartCard.test.js b/src/__tests__/components/chart/HorizontalBarChartCard.test.js index b71b53b4..9c79a1aa 100644 --- a/src/__tests__/components/chart/HorizontalBarChartCard.test.js +++ b/src/__tests__/components/chart/HorizontalBarChartCard.test.js @@ -16,11 +16,7 @@ describe('HorizontalBarChartCard', () => { it('renders with empty labels', () => { const element = shallow(); expect(element).toBeDefined(); - expect(element.find(ReactApexChart).length).toBe(1); - - const chartProps = element.find(ReactApexChart).props(); - expect(chartProps.options.xaxis.categories.length).toBe(0); - expect(chartProps.series[0].data.length).toBe(5); + expect(element.find(ReactApexChart).length).toBe(0); }); it('renders with non empty data and label', () => { diff --git a/src/__tests__/components/explanation/post_hoc.test.js b/src/__tests__/components/explanation/post_hoc.test.js index 0f112aaa..51128f3a 100644 --- a/src/__tests__/components/explanation/post_hoc.test.js +++ b/src/__tests__/components/explanation/post_hoc.test.js @@ -13,7 +13,7 @@ describe('Lime result', () => { traceId={1} limeValueList={{labels: [], values: []}}/>); expect(element).toBeDefined(); - expect(element.find(HorizontalBarChartCard).length).toBe(0); + expect(element.find(HorizontalBarChartCard).length).toBe(1); }); it('renders with data', () => {