Spaces:
Running
Running
fix (model behavior): Fix crash in model behavior due to unrefreshed state.
Browse files- src/components/filters/Filters.tsx +19 -13
- src/views/tasks-table/TasksTable.tsx +107 -86
src/components/filters/Filters.tsx
CHANGED
@@ -34,10 +34,12 @@ import {
|
|
34 |
TabPanel,
|
35 |
} from '@carbon/react';
|
36 |
import { ChevronUp, ChevronDown, Filter } from '@carbon/icons-react';
|
|
|
|
|
|
|
37 |
import ExpressionBuilder from '@/src/components/expression-builder/ExpressionBuilder';
|
38 |
|
39 |
import classes from './Filters.module.scss';
|
40 |
-
import { Metric, Model } from '@/src/types';
|
41 |
|
42 |
// ===================================================================================
|
43 |
// TYPES
|
@@ -167,12 +169,14 @@ export default function Filters({
|
|
167 |
</div>
|
168 |
</TabPanel>
|
169 |
<TabPanel>
|
170 |
-
<
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
|
|
|
|
176 |
</TabPanel>
|
177 |
</TabPanels>
|
178 |
</Tabs>
|
@@ -219,12 +223,14 @@ export default function Filters({
|
|
219 |
})}
|
220 |
</div>
|
221 |
) : expression ? (
|
222 |
-
<
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
|
|
|
|
228 |
) : null
|
229 |
) : null}
|
230 |
</div>
|
|
|
34 |
TabPanel,
|
35 |
} from '@carbon/react';
|
36 |
import { ChevronUp, ChevronDown, Filter } from '@carbon/icons-react';
|
37 |
+
|
38 |
+
import { Metric, Model } from '@/src/types';
|
39 |
+
import { hash } from '@/src/utilities/strings';
|
40 |
import ExpressionBuilder from '@/src/components/expression-builder/ExpressionBuilder';
|
41 |
|
42 |
import classes from './Filters.module.scss';
|
|
|
43 |
|
44 |
// ===================================================================================
|
45 |
// TYPES
|
|
|
169 |
</div>
|
170 |
</TabPanel>
|
171 |
<TabPanel>
|
172 |
+
<div key={hash(JSON.stringify(expression))}>
|
173 |
+
<ExpressionBuilder
|
174 |
+
expression={expression}
|
175 |
+
models={models}
|
176 |
+
metric={metric}
|
177 |
+
setExpression={setExpression}
|
178 |
+
></ExpressionBuilder>
|
179 |
+
</div>
|
180 |
</TabPanel>
|
181 |
</TabPanels>
|
182 |
</Tabs>
|
|
|
223 |
})}
|
224 |
</div>
|
225 |
) : expression ? (
|
226 |
+
<div key={hash(JSON.stringify(expression))}>
|
227 |
+
<ExpressionBuilder
|
228 |
+
expression={expression}
|
229 |
+
models={models}
|
230 |
+
metric={metric}
|
231 |
+
setExpression={setExpression}
|
232 |
+
></ExpressionBuilder>
|
233 |
+
</div>
|
234 |
) : null
|
235 |
) : null}
|
236 |
</div>
|
src/views/tasks-table/TasksTable.tsx
CHANGED
@@ -117,18 +117,20 @@ function populateTable(
|
|
117 |
// Add annotations
|
118 |
entry[`${evaluation.modelId}::value`] = {};
|
119 |
metrics.forEach((metric) => {
|
120 |
-
if (annotator) {
|
121 |
entry[`${evaluation.modelId}::value`][metric.name] =
|
122 |
extractMetricDisplayValue(
|
123 |
evaluation[metric.name][annotator].value,
|
124 |
metric.values,
|
125 |
);
|
126 |
-
} else {
|
127 |
entry[`${evaluation.modelId}::value`][metric.name] =
|
128 |
extractMetricDisplayValue(
|
129 |
evaluation[`${metric.name}_agg`].value,
|
130 |
metric.values,
|
131 |
);
|
|
|
|
|
132 |
}
|
133 |
});
|
134 |
|
@@ -177,6 +179,7 @@ function sparkline(
|
|
177 |
[key: string]: { timestamp: number; value: string };
|
178 |
},
|
179 |
metric: Metric,
|
|
|
180 |
theme?: string,
|
181 |
) {
|
182 |
if (annotations) {
|
@@ -209,52 +212,54 @@ function sparkline(
|
|
209 |
const numOfUsedValues = data.filter((entry) => entry.value !== 0).length;
|
210 |
|
211 |
return (
|
212 |
-
<
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
entry
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
axes: {
|
228 |
-
left: {
|
229 |
-
mapsTo: 'value',
|
230 |
-
visible: false,
|
231 |
-
scaleType: ScaleTypes.LINEAR,
|
232 |
},
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
237 |
},
|
238 |
-
|
239 |
-
|
240 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
241 |
enabled: false,
|
242 |
},
|
243 |
-
|
244 |
enabled: false,
|
245 |
},
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
}
|
250 |
-
|
251 |
-
|
252 |
-
},
|
253 |
-
height: '24px',
|
254 |
-
width: '48px',
|
255 |
-
theme: theme,
|
256 |
-
}}
|
257 |
-
></SimpleBarChart>
|
258 |
);
|
259 |
}
|
260 |
|
@@ -598,57 +603,73 @@ export default function TasksTable({
|
|
598 |
) : (
|
599 |
<TableCell key={cell.id}>
|
600 |
<div className={classes.tableCell}>
|
601 |
-
|
602 |
-
|
603 |
-
|
604 |
-
|
605 |
-
|
606 |
-
|
607 |
-
|
608 |
-
|
609 |
-
|
610 |
-
|
611 |
-
|
612 |
-
|
613 |
-
|
614 |
-
|
615 |
-
|
616 |
-
|
617 |
-
|
618 |
-
|
619 |
-
|
620 |
-
|
621 |
-
|
622 |
-
|
623 |
-
|
624 |
-
|
|
|
|
|
|
|
|
|
|
|
625 |
evaluationsMap[
|
626 |
cell.id.split(
|
627 |
'::value',
|
628 |
1,
|
629 |
)[0]
|
630 |
-
]
|
631 |
-
|
632 |
-
|
633 |
-
|
634 |
-
|
635 |
-
|
636 |
-
|
637 |
-
|
638 |
-
|
639 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
640 |
) : (
|
641 |
<div className={classes.majorityValue}>
|
642 |
-
|
643 |
-
? cell.value.join(', ')
|
644 |
-
: cell.value}
|
645 |
</div>
|
646 |
-
)
|
647 |
-
|
648 |
-
<div className={classes.majorityValue}>
|
649 |
-
-
|
650 |
-
</div>
|
651 |
-
)}
|
652 |
</div>
|
653 |
</TableCell>
|
654 |
),
|
@@ -662,7 +683,7 @@ export default function TasksTable({
|
|
662 |
}}
|
663 |
</DataTable>
|
664 |
<Pagination
|
665 |
-
pageSizes={[10, 25, 50
|
666 |
totalItems={rows.length}
|
667 |
onChange={(event: any) => {
|
668 |
// Step 1: Update page size
|
|
|
117 |
// Add annotations
|
118 |
entry[`${evaluation.modelId}::value`] = {};
|
119 |
metrics.forEach((metric) => {
|
120 |
+
if (annotator && evaluation.hasOwnProperty(metric.name)) {
|
121 |
entry[`${evaluation.modelId}::value`][metric.name] =
|
122 |
extractMetricDisplayValue(
|
123 |
evaluation[metric.name][annotator].value,
|
124 |
metric.values,
|
125 |
);
|
126 |
+
} else if (evaluation.hasOwnProperty(`${metric.name}_agg`)) {
|
127 |
entry[`${evaluation.modelId}::value`][metric.name] =
|
128 |
extractMetricDisplayValue(
|
129 |
evaluation[`${metric.name}_agg`].value,
|
130 |
metric.values,
|
131 |
);
|
132 |
+
} else {
|
133 |
+
entry[`${evaluation.modelId}::value`][metric.name] = '-';
|
134 |
}
|
135 |
});
|
136 |
|
|
|
179 |
[key: string]: { timestamp: number; value: string };
|
180 |
},
|
181 |
metric: Metric,
|
182 |
+
key: string,
|
183 |
theme?: string,
|
184 |
) {
|
185 |
if (annotations) {
|
|
|
212 |
const numOfUsedValues = data.filter((entry) => entry.value !== 0).length;
|
213 |
|
214 |
return (
|
215 |
+
<div key={key}>
|
216 |
+
<SimpleBarChart
|
217 |
+
data={data}
|
218 |
+
options={{
|
219 |
+
color: {
|
220 |
+
scale: Object.fromEntries(
|
221 |
+
data.map((entry) => [
|
222 |
+
entry.group,
|
223 |
+
numOfUsedValues === 1
|
224 |
+
? '#42be65'
|
225 |
+
: numOfUsedValues >= 3
|
226 |
+
? '#fa4d56'
|
227 |
+
: '#f1c21b',
|
228 |
+
]),
|
229 |
+
),
|
|
|
|
|
|
|
|
|
|
|
230 |
},
|
231 |
+
axes: {
|
232 |
+
left: {
|
233 |
+
mapsTo: 'value',
|
234 |
+
visible: false,
|
235 |
+
scaleType: ScaleTypes.LINEAR,
|
236 |
+
},
|
237 |
+
bottom: {
|
238 |
+
mapsTo: 'group',
|
239 |
+
visible: false,
|
240 |
+
scaleType: ScaleTypes.LABELS,
|
241 |
+
},
|
242 |
},
|
243 |
+
grid: {
|
244 |
+
y: {
|
245 |
+
enabled: false,
|
246 |
+
},
|
247 |
+
x: {
|
248 |
+
enabled: false,
|
249 |
+
},
|
250 |
+
},
|
251 |
+
legend: {
|
252 |
enabled: false,
|
253 |
},
|
254 |
+
toolbar: {
|
255 |
enabled: false,
|
256 |
},
|
257 |
+
height: '24px',
|
258 |
+
width: '48px',
|
259 |
+
theme: theme,
|
260 |
+
}}
|
261 |
+
></SimpleBarChart>
|
262 |
+
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
263 |
);
|
264 |
}
|
265 |
|
|
|
603 |
) : (
|
604 |
<TableCell key={cell.id}>
|
605 |
<div className={classes.tableCell}>
|
606 |
+
<>
|
607 |
+
{cell.value ? (
|
608 |
+
typeof cell.value === 'object' ? (
|
609 |
+
<>
|
610 |
+
{Array.isArray(cell.value)
|
611 |
+
? !isEmpty(cell.value)
|
612 |
+
? cell.value.join(', ')
|
613 |
+
: '-'
|
614 |
+
: metrics.map((metric) => {
|
615 |
+
return (
|
616 |
+
<>
|
617 |
+
<div
|
618 |
+
className={
|
619 |
+
classes.tableCellValue
|
620 |
+
}
|
621 |
+
key={`${cell.id}::${metric.name}`}
|
622 |
+
>
|
623 |
+
<div
|
624 |
+
className={
|
625 |
+
classes.majorityValue
|
626 |
+
}
|
627 |
+
>
|
628 |
+
{
|
629 |
+
cell.value[
|
630 |
+
metric.name
|
631 |
+
]
|
632 |
+
}
|
633 |
+
</div>
|
634 |
+
{!annotator &&
|
635 |
evaluationsMap[
|
636 |
cell.id.split(
|
637 |
'::value',
|
638 |
1,
|
639 |
)[0]
|
640 |
+
]
|
641 |
+
? sparkline(
|
642 |
+
evaluationsMap[
|
643 |
+
cell.id.split(
|
644 |
+
'::value',
|
645 |
+
1,
|
646 |
+
)[0]
|
647 |
+
][metric.name],
|
648 |
+
metric,
|
649 |
+
cell.id,
|
650 |
+
theme,
|
651 |
+
)
|
652 |
+
: null}
|
653 |
+
</div>
|
654 |
+
</>
|
655 |
+
);
|
656 |
+
})}
|
657 |
+
</>
|
658 |
+
) : (
|
659 |
+
<div className={classes.majorityValue}>
|
660 |
+
{Array.isArray(cell.value)
|
661 |
+
? !isEmpty(cell.value)
|
662 |
+
? cell.value.join(', ')
|
663 |
+
: '-'
|
664 |
+
: cell.value}
|
665 |
+
</div>
|
666 |
+
)
|
667 |
) : (
|
668 |
<div className={classes.majorityValue}>
|
669 |
+
-
|
|
|
|
|
670 |
</div>
|
671 |
+
)}
|
672 |
+
</>
|
|
|
|
|
|
|
|
|
673 |
</div>
|
674 |
</TableCell>
|
675 |
),
|
|
|
683 |
}}
|
684 |
</DataTable>
|
685 |
<Pagination
|
686 |
+
pageSizes={[10, 25, 50]}
|
687 |
totalItems={rows.length}
|
688 |
onChange={(event: any) => {
|
689 |
// Step 1: Update page size
|