diff --git a/optuna_dashboard/__init__.py b/optuna_dashboard/__init__.py
index cf75f553..efe3e1d1 100644
--- a/optuna_dashboard/__init__.py
+++ b/optuna_dashboard/__init__.py
@@ -10,4 +10,4 @@ from ._objective_form_widget import register_objective_form_widgets # noqa
from ._objective_form_widget import register_user_attr_form_widgets # noqa
-__version__ = "0.9.0b6"
+__version__ = "0.9.0"
diff --git a/optuna_dashboard/ts/action.ts b/optuna_dashboard/ts/action.ts
index 76889e77..3090948c 100644
--- a/optuna_dashboard/ts/action.ts
+++ b/optuna_dashboard/ts/action.ts
@@ -447,17 +447,9 @@ export const actionCreator = () => {
})
}
- const tellTrial = (
- studyId: number,
- trialId: number,
- state: TrialStateFinished,
- values?: number[]
- ): void => {
- const message =
- values === undefined
- ? `id=${trialId}, state=${state}`
- : `id=${trialId}, state=${state}, values=${values}`
- tellTrialAPI(trialId, state, values)
+ const makeTrialFail = (studyId: number, trialId: number): void => {
+ const message = `id=${trialId}, state=Fail`
+ tellTrialAPI(trialId, "Fail")
.then(() => {
const index = studyDetails[studyId].trials.findIndex(
(t) => t.trial_id === trialId
@@ -468,7 +460,41 @@ export const actionCreator = () => {
})
return
}
- setTrialStateValues(studyId, index, state, values)
+ setTrialStateValues(studyId, index, "Fail")
+ enqueueSnackbar(`Successfully updated trial (${message})`, {
+ variant: "success",
+ })
+ })
+ .catch((err) => {
+ const reason = err.response?.data.reason
+ enqueueSnackbar(
+ `Failed to update trial (${message}). Reason: ${reason}`,
+ {
+ variant: "error",
+ }
+ )
+ console.log(err)
+ })
+ }
+
+ const makeTrialComplete = (
+ studyId: number,
+ trialId: number,
+ values: number[]
+ ): void => {
+ const message = `id=${trialId}, state=Complete, values=${values}`
+ tellTrialAPI(trialId, "Complete", values)
+ .then(() => {
+ const index = studyDetails[studyId].trials.findIndex(
+ (t) => t.trial_id === trialId
+ )
+ if (index === -1) {
+ enqueueSnackbar(`Unexpected error happens. Please reload the page.`, {
+ variant: "error",
+ })
+ return
+ }
+ setTrialStateValues(studyId, index, "Complete", values)
enqueueSnackbar(`Successfully updated trial (${message})`, {
variant: "success",
})
@@ -535,7 +561,8 @@ export const actionCreator = () => {
saveTrialNote,
uploadArtifact,
deleteArtifact,
- tellTrial,
+ makeTrialComplete,
+ makeTrialFail,
saveTrialUserAttrs,
}
}
diff --git a/optuna_dashboard/ts/components/BestTrialsCard.tsx b/optuna_dashboard/ts/components/BestTrialsCard.tsx
index ad18418e..fe375604 100644
--- a/optuna_dashboard/ts/components/BestTrialsCard.tsx
+++ b/optuna_dashboard/ts/components/BestTrialsCard.tsx
@@ -32,16 +32,22 @@ export const BestTrialsCard: FC<{
header = `Best Trial (number=${bestTrial.number})`
content = (
<>
-
- {bestTrial.values}
-
+ {bestTrial.values === undefined || bestTrial.values.length === 1 ? (
+
+ {bestTrial.values}
+
+ ) : (
+
+ Objective Values = [{bestTrial.values?.join(", ")}]
+
+ )}
Params = [
{bestTrial.params
diff --git a/optuna_dashboard/ts/components/ObjectiveForm.tsx b/optuna_dashboard/ts/components/ObjectiveForm.tsx
index 704a7916..40b869a9 100644
--- a/optuna_dashboard/ts/components/ObjectiveForm.tsx
+++ b/optuna_dashboard/ts/components/ObjectiveForm.tsx
@@ -70,7 +70,7 @@ export const ObjectiveForm: FC<{
if (filtered.length !== directions.length) {
return
}
- action.tellTrial(trial.study_id, trial.trial_id, "Complete", filtered)
+ action.makeTrialComplete(trial.study_id, trial.trial_id, filtered)
} else if (outputType == "user_attr") {
const user_attrs = Object.fromEntries(widgets.map((widget, i) => [widget.description, values[i]]))
action.saveTrialUserAttrs(trial.study_id, trial.trial_id, user_attrs)
@@ -268,7 +268,7 @@ export const ObjectiveForm: FC<{
variant="outlined"
color="error"
onClick={() => {
- action.tellTrial(trial.study_id, trial.trial_id, "Fail")
+ action.makeTrialFail(trial.study_id, trial.trial_id)
}}
>
Fail Trial
diff --git a/optuna_dashboard/ts/components/TrialList.tsx b/optuna_dashboard/ts/components/TrialList.tsx
index 85ba3d68..0f1a51da 100644
--- a/optuna_dashboard/ts/components/TrialList.tsx
+++ b/optuna_dashboard/ts/components/TrialList.tsx
@@ -160,7 +160,7 @@ const TrialListDetail: FC<{
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"],
+ ["Value", trial.values?.map((v) => v.toString()).join(", ") || "None"],
[
"Intermediate Values",
diff --git a/optuna_dashboard/ts/components/TrialTable.tsx b/optuna_dashboard/ts/components/TrialTable.tsx
index 3ea8e14a..32206e8a 100644
--- a/optuna_dashboard/ts/components/TrialTable.tsx
+++ b/optuna_dashboard/ts/components/TrialTable.tsx
@@ -295,7 +295,7 @@ export const TrialTable: FC<{
return
}
- action.tellTrial(studyId, trialId, "Complete", objectiveValues)
+ action.makeTrialComplete(studyId, trialId, objectiveValues)
}
const handleFailTrial = (e: MouseEvent): void => {
@@ -304,7 +304,7 @@ export const TrialTable: FC<{
}
const studyId = studyDetail.id
const trialId = trials[index].trial_id
- action.tellTrial(studyId, trialId, "Fail")
+ action.makeTrialFail(studyId, trialId)
}
return (
diff --git a/optuna_dashboard/ts/dominatedTrials.ts b/optuna_dashboard/ts/dominatedTrials.ts
index 632e2cf7..06afb15f 100644
--- a/optuna_dashboard/ts/dominatedTrials.ts
+++ b/optuna_dashboard/ts/dominatedTrials.ts
@@ -27,7 +27,7 @@ export const getDominatedTrials = (
const dominatedTrials: boolean[] = []
normalizedValues.forEach((values0: number[], i: number) => {
const dominated = normalizedValues.some((values1: number[], j: number) => {
- if (i === j) {
+ if (i === j || values0.every((v, i) => v == values1[i])) {
return false
}
return values0.every((value0: number, k: number) => {
diff --git a/package-lock.json b/package-lock.json
index 0a7ce562..cf383fae 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -49,7 +49,7 @@
"ts-jest": "^29.0.3",
"ts-loader": "^9.2.7",
"typescript": "^4.6.2",
- "webpack": "^5.70.0",
+ "webpack": "^5.76.0",
"webpack-cli": "^4.9.2"
}
},
@@ -13310,9 +13310,9 @@
}
},
"node_modules/webpack": {
- "version": "5.75.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz",
- "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==",
+ "version": "5.76.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz",
+ "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==",
"dev": true,
"dependencies": {
"@types/eslint-scope": "^3.7.3",
@@ -23273,9 +23273,9 @@
"integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
},
"webpack": {
- "version": "5.75.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz",
- "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==",
+ "version": "5.76.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz",
+ "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==",
"dev": true,
"requires": {
"@types/eslint-scope": "^3.7.3",
diff --git a/package.json b/package.json
index ba543732..d39584c1 100644
--- a/package.json
+++ b/package.json
@@ -56,7 +56,7 @@
"ts-jest": "^29.0.3",
"ts-loader": "^9.2.7",
"typescript": "^4.6.2",
- "webpack": "^5.70.0",
+ "webpack": "^5.76.0",
"webpack-cli": "^4.9.2"
}
}