diff --git a/optuna_dashboard/static/components/StudyDetail.tsx b/optuna_dashboard/static/components/StudyDetail.tsx index 7628545f0..aef0b1adc 100644 --- a/optuna_dashboard/static/components/StudyDetail.tsx +++ b/optuna_dashboard/static/components/StudyDetail.tsx @@ -4,6 +4,8 @@ import { Link, useParams } from "react-router-dom" import { createStyles, fade, makeStyles, Theme } from "@material-ui/core/styles" import { AppBar, + Dialog, + Checkbox, Card, Typography, CardContent, @@ -15,9 +17,10 @@ import { IconButton, Select, MenuItem, + FormGroup, } from "@material-ui/core" -import { Home, Cached } from "@material-ui/icons" - +import { Home, Cached, Settings } from "@material-ui/icons" +import CloseIcon from "@material-ui/icons/Close" import { DataGridColumn, DataGrid } from "./DataGrid" import { GraphParallelCoordinate } from "./GraphParallelCoordinate" import { GraphHyperparameterImportances } from "./GraphHyperparameterImportances" @@ -29,6 +32,9 @@ import { GraphHistory } from "./GraphHistory" import { GraphParetoFront } from "./GraphParetoFront" import { actionCreator } from "../action" import { studyDetailsState } from "../state" +import FormControlLabel from "@material-ui/core/FormControlLabel" +import MuiDialogTitle from "@material-ui/core/DialogTitle" +import MuiDialogContent from "@material-ui/core/DialogContent" const useStyles = makeStyles((theme: Theme) => createStyles({ @@ -79,6 +85,17 @@ const useStyles = makeStyles((theme: Theme) => grow: { flexGrow: 1, }, + dialogTitle: { + margin: 0, + padding: theme.spacing(2), + minWidth: 300, + }, + dialogCloseButton: { + position: "absolute", + right: theme.spacing(1), + top: theme.spacing(1), + color: theme.palette.grey[500], + }, }) ) @@ -101,9 +118,42 @@ export const StudyDetail: FC = () => { const { studyId } = useParams() const studyIdNumber = parseInt(studyId, 10) const studyDetail = useStudyDetailValue(studyIdNumber) - const [openReloadIntervalSelect, setOpenReloadIntervalSelect] = + const [openReloadIntervalSelect, setPrefOpenReloadIntervalSelect] = useState(false) const [reloadInterval, setReloadInterval] = useState(10) + const savedPref = localStorage.getItem("savedPref") + const graphsChecked = + savedPref !== null + ? JSON.parse(savedPref) + : { + graphHistoryChecked: true, + graphParetoFrontChecked: true, + graphParallelCoordinateChecked: true, + graphIntermediateValuesChecked: true, + edfChecked: true, + graphHyperparameterImportancesChecked: true, + graphSliceChecked: true, + } + + const [prefOpen, setPrefOpen] = React.useState(false) + const handleClickOpen = () => { + setPrefOpen(true) + } + const handleClose = () => { + setPrefOpen(false) + } + const [chartsShown, setChartsShown] = React.useState(graphsChecked) + useEffect(() => { + localStorage.setItem("savedPref", JSON.stringify(chartsShown)) + }, [chartsShown]) + const handleChartShownChange = ( + event: React.ChangeEvent + ) => { + setChartsShown({ + ...chartsShown, + [event.target.name]: event.target.checked, + }) + } useEffect(() => { action.updateStudyDetail(studyIdNumber) @@ -125,6 +175,102 @@ export const StudyDetail: FC = () => { return (
+ + +
+ Visualization Preference +
+ + + + +
+ + + + + } + label="History" + /> + + } + label="Pareto Front" + /> + + } + label="Parallel Coordinate" + /> + + } + label="Intermediate Values" + /> + + } + label="Edf" + /> + + } + label="Hyperparameter Importances" + /> + + } + label="Slice" + /> + + +
@@ -133,7 +279,7 @@ export const StudyDetail: FC = () => {
{ - setOpenReloadIntervalSelect(!openReloadIntervalSelect) + setPrefOpenReloadIntervalSelect(!openReloadIntervalSelect) }} >
@@ -144,10 +290,10 @@ export const StudyDetail: FC = () => { className={classes.reloadSelect} open={openReloadIntervalSelect} onOpen={() => { - setOpenReloadIntervalSelect(true) + setPrefOpenReloadIntervalSelect(true) }} onClose={() => { - setOpenReloadIntervalSelect(false) + setPrefOpenReloadIntervalSelect(false) }} onChange={(e) => { setReloadInterval(e.target.value as number) @@ -160,6 +306,10 @@ export const StudyDetail: FC = () => { 60s
+ + + + { {title} - - - - - - {studyDetail !== null && !isSingleObjectiveStudy(studyDetail) ? ( + {chartsShown.graphHistoryChecked ? ( + + + + + + ) : null} + + {studyDetail !== null && + !isSingleObjectiveStudy(studyDetail) && + chartsShown.graphParetoFrontChecked ? ( ) : null} - - - - - - {studyDetail !== null && isSingleObjectiveStudy(studyDetail) ? ( + {chartsShown.graphParallelCoordinateChecked ? ( + + + + + + ) : null} + + {studyDetail !== null && + isSingleObjectiveStudy(studyDetail) && + chartsShown.graphIntermediateValuesChecked ? ( ) : null} - - - - - - - - - - - {studyDetail !== null ? ( + {chartsShown.edfChecked ? ( + + + + + + ) : null} + {chartsShown.graphHyperparameterImportancesChecked ? ( + + + + + + ) : null} + + {studyDetail !== null && chartsShown.graphSliceChecked ? (