From ea26215a19fc5558276e07fe0d3d29f2c29a38b4 Mon Sep 17 00:00:00 2001 From: keisuke-umezawa Date: Sun, 8 Jan 2023 21:25:20 +0900 Subject: [PATCH] Implement python api --- optuna_dashboard/_app.py | 14 +++++++++++++ optuna_dashboard/ts/action.ts | 21 +++++++++++++++++++ optuna_dashboard/ts/apiClient.ts | 12 +++++++++++ optuna_dashboard/ts/components/TrialTable.tsx | 10 ++++++++- 4 files changed, 56 insertions(+), 1 deletion(-) diff --git a/optuna_dashboard/_app.py b/optuna_dashboard/_app.py index 2330cf78..71262347 100644 --- a/optuna_dashboard/_app.py +++ b/optuna_dashboard/_app.py @@ -411,6 +411,20 @@ def create_app(storage: BaseStorage, debug: bool = False) -> Bottle: response.status = 204 # No content return {} + @app.put("/api/studies//") + @json_api_view + def save_trial_value(study_id: int, trial_id: int) -> BottleViewReturn: + value = float(request.json.get("value", None)) + try: + study_name = storage.get_study_name_from_id(study_id) + study = optuna.load_study(storage=storage, study_name=study_name) + except KeyError: + response.status = 404 # Not found + return {"reason": f"study_id={study_id} is not found"} + study.tell(trial_id, value) + response.status = 204 # No content + return {} + @app.put("/api/studies///note") @json_api_view def save_trial_note(study_id: int, trial_id: int) -> BottleViewReturn: diff --git a/optuna_dashboard/ts/action.ts b/optuna_dashboard/ts/action.ts index edec6741..14eb48e7 100644 --- a/optuna_dashboard/ts/action.ts +++ b/optuna_dashboard/ts/action.ts @@ -8,6 +8,7 @@ import { deleteStudyAPI, saveStudyNoteAPI, saveTrialNoteAPI, + saveTrialValueAPI, renameStudyAPI, } from "./apiClient" import { @@ -265,6 +266,25 @@ export const actionCreator = () => { }) } + const saveTrialValue = ( + studyId: number, + trialId: number, + value: number + ) => { + saveTrialValueAPI(studyId, trialId, value) + .then(() => { + enqueueSnackbar(`Success to update trial value (id=${studyId})`, { + variant: "success", + }) + }) + .catch((err) => { + enqueueSnackbar(`Failed to update trial value (id=${studyId})`, { + variant: "error", + }) + console.log(err) + }) + } + return { updateStudyDetail, updateStudySummaries, @@ -276,6 +296,7 @@ export const actionCreator = () => { saveGraphVisibility, saveStudyNote, saveTrialNote, + saveTrialValue, } } diff --git a/optuna_dashboard/ts/apiClient.ts b/optuna_dashboard/ts/apiClient.ts index bf4c1a6a..2405bf99 100644 --- a/optuna_dashboard/ts/apiClient.ts +++ b/optuna_dashboard/ts/apiClient.ts @@ -217,6 +217,18 @@ export const saveTrialNoteAPI = ( }) } +export const saveTrialValueAPI = ( + studyId: number, + trialId: number, + value: number, +): Promise => { + return axiosInstance + .put(`/api/studies/${studyId}/${trialId}`, {value: value}) + .then((res) => { + return + }) +} + interface ParamImportancesResponse { param_importances: ParamImportance[][] } diff --git a/optuna_dashboard/ts/components/TrialTable.tsx b/optuna_dashboard/ts/components/TrialTable.tsx index 0b120cda..a7d61358 100644 --- a/optuna_dashboard/ts/components/TrialTable.tsx +++ b/optuna_dashboard/ts/components/TrialTable.tsx @@ -5,6 +5,8 @@ import LinkIcon from "@mui/icons-material/Link" import { DataGridColumn, DataGrid } from "./DataGrid" import { Link } from "react-router-dom" +import { actionCreator } from "../action" + export const TrialTable: FC<{ studyDetail: StudyDetail | null isBeta: boolean @@ -12,6 +14,7 @@ export const TrialTable: FC<{ }> = ({ studyDetail, isBeta, initialRowsPerPage }) => { const trials: Trial[] = studyDetail !== null ? studyDetail.trials : [] const objectiveNames: string[] = studyDetail?.objective_names || [] + const action = actionCreator() const columns: DataGridColumn[] = [ { field: "number", label: "Number", sortable: true, padding: "none" }, @@ -264,13 +267,18 @@ export const TrialTable: FC<{ const collapseBody = (index: number) => { - const [value, setValue] = useState(0.0) + const [value, setValue] = useState("") const handleSubmit = (e) => { e.preventDefault() + const v = (+value) as number; + const studyId = (studyDetail as StudyDetail).id + const trialId = trials[index].number + action.saveTrialValue(studyId, trialId, v) console.log({ index, value, }) + } const handleChangeValue = (e) => { setValue(e.target.value)