From 1f003403203e2e0f338c55eecab36cff0c6af36a Mon Sep 17 00:00:00 2001 From: c-bata Date: Fri, 13 Jan 2023 18:09:36 +0900 Subject: [PATCH] Improve TrialList UI --- optuna_dashboard/ts/components/TrialList.tsx | 186 +++++++++---------- 1 file changed, 88 insertions(+), 98 deletions(-) diff --git a/optuna_dashboard/ts/components/TrialList.tsx b/optuna_dashboard/ts/components/TrialList.tsx index 37b83a75..60e63c64 100644 --- a/optuna_dashboard/ts/components/TrialList.tsx +++ b/optuna_dashboard/ts/components/TrialList.tsx @@ -1,12 +1,8 @@ -import React, { FC, useMemo } from "react" +import React, { FC, ReactNode, useMemo } from "react" import { Typography, Box, - Card, - CardContent, useTheme, - CardHeader, - Grid, IconButton, Menu, MenuItem, @@ -23,7 +19,6 @@ import CheckBoxOutlineBlankIcon from "@mui/icons-material/CheckBoxOutlineBlank" import CheckBoxIcon from "@mui/icons-material/CheckBox" import { TrialNote } from "./Note" -import { DataGrid, DataGridColumn } from "./DataGrid" import { useHistory, useLocation } from "react-router-dom" import ListItemIcon from "@mui/material/ListItemIcon" @@ -135,37 +130,87 @@ const TrialListDetail: FC<{ if (startMs !== undefined && completeMs !== undefined) { duration = (completeMs - startMs).toString() } - const collapseIntermediateValueColumns: DataGridColumn[] = + + const params = trial.state === "Waiting" ? trial.fixed_params : trial.params + const info: [string, string | null | ReactNode][] = [ + ["Value", trial.values?.map((v) => v.toString()).join(" ") || "None"], [ - { field: "step", label: "Step", sortable: true }, - { - field: "value", - label: "Value", - sortable: true, - less: (firstEl, secondEl): number => { - const firstVal = firstEl.value - const secondVal = secondEl.value - if (firstVal === secondVal) { - return 0 - } - if (firstVal === "nan") { - return -1 - } else if (secondVal === "nan") { - return 1 - } - if (firstVal === "-inf" || secondVal === "inf") { - return 1 - } else if (secondVal === "-inf" || firstVal === "inf") { - return -1 - } - return firstVal < secondVal ? 1 : -1 - }, - }, - ] - const collapseAttrColumns: DataGridColumn[] = [ - { field: "key", label: "Key", sortable: true }, - { field: "value", label: "Value", sortable: true }, + "Intermediate Values", + + {trial.intermediate_values.map((v) => ( + + {v.step} {v.value} + + ))} + , + ], + [ + "Parameter", + + {params.map((p) => ( + + {p.name} {p.param_external_value} + + ))} + , + ], + [ + "Started At", + trial?.datetime_start ? trial?.datetime_start.toString() : null, + ], + [ + "Completed At", + trial?.datetime_complete ? trial?.datetime_complete.toString() : null, + ], + ["Duration", `${duration} ms`], + [ + "User Attributes", + + {trial.user_attrs.map((t) => ( + + {t.key} {t.value} + + ))} + , + ], ] + const renderInfo = ( + key: string, + value: string | null | ReactNode + ): ReactNode => ( + + + {key} + + + {value} + + + ) return ( @@ -189,39 +234,14 @@ const TrialListDetail: FC<{ ) : null} - - - Values = [{trial.values?.map((v) => v.toString()).join(" ") || "None"} - ] - - {trial.state !== "Waiting" ? ( - - Params = [ - {trial.params - .map((p) => `${p.name}: ${p.param_external_value}`) - .join(", ")} - ] - - ) : ( - - Params = [ - {trial.fixed_params - .map((p) => `${p.name}: ${p.param_external_value}`) - .join(", ")} - ] - - )} - - Started At ={" "} - {trial?.datetime_start ? trial?.datetime_start.toString() : null} - - - Completed At ={" "} - {trial?.datetime_complete - ? trial?.datetime_complete.toString() - : null} - - Duration = {duration} ms + + {info.map(([key, value]) => renderInfo(key, value))} - - - - - - - columns={collapseIntermediateValueColumns} - rows={trial.intermediate_values} - keyField={"step"} - dense={true} - rowsPerPageOption={[5, 10, { label: "All", value: -1 }]} - /> - - - - - - - - - columns={collapseAttrColumns} - rows={trial.user_attrs} - keyField={"key"} - dense={true} - rowsPerPageOption={[5, 10, { label: "All", value: -1 }]} - /> - - - - ) }