From 72b6742849eaef9ecb7ec4d4608f8e82e62a1efb Mon Sep 17 00:00:00 2001 From: gen740 Date: Fri, 17 Nov 2023 17:23:58 +0900 Subject: [PATCH 01/14] Rename sqlite3's `loadStorage` to `loadSQLite3Storage` --- standalone_app/src/components/StorageLoader.tsx | 6 +++--- standalone_app/src/journalStorage.ts | 9 +++++++++ standalone_app/src/sqlite3.ts | 2 +- standalone_app/src/vscode_entry.tsx | 4 ++-- 4 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 standalone_app/src/journalStorage.ts diff --git a/standalone_app/src/components/StorageLoader.tsx b/standalone_app/src/components/StorageLoader.tsx index c358acec..2968d16d 100644 --- a/standalone_app/src/components/StorageLoader.tsx +++ b/standalone_app/src/components/StorageLoader.tsx @@ -6,7 +6,7 @@ import React, { useRef, useState, } from "react" -import { loadStorage } from "../sqlite3" +import { loadSQLite3Storage } from "../sqlite3" import { useSetRecoilState } from "recoil" import { studiesState } from "../state" import { @@ -30,7 +30,7 @@ export const StorageLoader: FC = () => { r.addEventListener("load", () => { const arrayBuffer = r.result as ArrayBuffer | null if (arrayBuffer !== null) { - loadStorage(arrayBuffer, setStudies) + loadSQLite3Storage(arrayBuffer, setStudies) } }) r.readAsArrayBuffer(file) @@ -108,7 +108,7 @@ export const StorageLoader: FC = () => { - Drag your SQLite3 file here or click to browse. + Drag your SQLite3/JournalStorage file here or click to browse. diff --git a/standalone_app/src/journalStorage.ts b/standalone_app/src/journalStorage.ts new file mode 100644 index 00000000..75151110 --- /dev/null +++ b/standalone_app/src/journalStorage.ts @@ -0,0 +1,9 @@ +import { SetterOrUpdater } from "recoil" + +export const loadStorage = ( + arrayBuffer: ArrayBuffer, + setter: SetterOrUpdater +): void => { + + +} diff --git a/standalone_app/src/sqlite3.ts b/standalone_app/src/sqlite3.ts index 3a04c163..46151b22 100644 --- a/standalone_app/src/sqlite3.ts +++ b/standalone_app/src/sqlite3.ts @@ -10,7 +10,7 @@ type SQLite3DB = { }): void } -export const loadStorage = ( +export const loadSQLite3Storage = ( arrayBuffer: ArrayBuffer, setter: SetterOrUpdater ): void => { diff --git a/standalone_app/src/vscode_entry.tsx b/standalone_app/src/vscode_entry.tsx index ad36ebdc..8eac5b4c 100644 --- a/standalone_app/src/vscode_entry.tsx +++ b/standalone_app/src/vscode_entry.tsx @@ -4,7 +4,7 @@ import "./index.css" import { App } from "./components/App" import { RecoilRoot, useSetRecoilState, SetterOrUpdater } from "recoil" import { studiesState } from "./state" -import { loadStorage } from "./sqlite3" +import { loadSQLite3Storage } from "./sqlite3" export const AppWrapper: FC = () => { const setStudies = useSetRecoilState(studiesState) @@ -35,7 +35,7 @@ export const AppWrapper: FC = () => { bytes[i] = binaryString.charCodeAt(i) } arrayBuffer = bytes.buffer - loadStorage(arrayBuffer, onceSetStudies) + loadSQLite3Storage(arrayBuffer, onceSetStudies) break } }) From 585c5b8458cdd4e113b5233aad2be0b919dab50f Mon Sep 17 00:00:00 2001 From: gen740 Date: Fri, 17 Nov 2023 17:43:11 +0900 Subject: [PATCH 02/14] Call `loadJournalStorage` if file extension is `.log` --- standalone_app/src/components/StorageLoader.tsx | 8 +++++++- standalone_app/src/journalStorage.ts | 6 +++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/standalone_app/src/components/StorageLoader.tsx b/standalone_app/src/components/StorageLoader.tsx index 2968d16d..65d139b0 100644 --- a/standalone_app/src/components/StorageLoader.tsx +++ b/standalone_app/src/components/StorageLoader.tsx @@ -7,6 +7,7 @@ import React, { useState, } from "react" import { loadSQLite3Storage } from "../sqlite3" +import { loadJournalStorage } from "../journalStorage" import { useSetRecoilState } from "recoil" import { studiesState } from "../state" import { @@ -29,8 +30,13 @@ export const StorageLoader: FC = () => { const r = new FileReader() r.addEventListener("load", () => { const arrayBuffer = r.result as ArrayBuffer | null + const fileExtension = file.name.split(".").pop() if (arrayBuffer !== null) { - loadSQLite3Storage(arrayBuffer, setStudies) + if (fileExtension == "log") { + loadJournalStorage(arrayBuffer, setStudies) + } else { + loadSQLite3Storage(arrayBuffer, setStudies) + } } }) r.readAsArrayBuffer(file) diff --git a/standalone_app/src/journalStorage.ts b/standalone_app/src/journalStorage.ts index 75151110..92343ab1 100644 --- a/standalone_app/src/journalStorage.ts +++ b/standalone_app/src/journalStorage.ts @@ -1,9 +1,9 @@ import { SetterOrUpdater } from "recoil" -export const loadStorage = ( +export const loadJournalStorage = ( arrayBuffer: ArrayBuffer, setter: SetterOrUpdater ): void => { - - + const decoder = new TextDecoder("utf-8") + console.log(decoder.decode(arrayBuffer)) } From 9930e1fe1fda2da1b85f00191cd79be93a1d407a Mon Sep 17 00:00:00 2001 From: gen740 Date: Fri, 17 Nov 2023 17:57:24 +0900 Subject: [PATCH 03/14] Add JournalOperation enum --- standalone_app/src/journalStorage.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/standalone_app/src/journalStorage.ts b/standalone_app/src/journalStorage.ts index 92343ab1..afccdfea 100644 --- a/standalone_app/src/journalStorage.ts +++ b/standalone_app/src/journalStorage.ts @@ -1,5 +1,18 @@ import { SetterOrUpdater } from "recoil" +enum JournalOperation { + CREATE_STUDY = 0, + DELETE_STUDY = 1, + SET_STUDY_USER_ATTR = 2, + SET_STUDY_SYSTEM_ATTR = 3, + CREATE_TRIAL = 4, + SET_TRIAL_PARAM = 5, + SET_TRIAL_STATE_VALUES = 6, + SET_TRIAL_INTERMEDIATE_VALUE = 7, + SET_TRIAL_USER_ATTR = 8, + SET_TRIAL_SYSTEM_ATTR = 9, +} + export const loadJournalStorage = ( arrayBuffer: ArrayBuffer, setter: SetterOrUpdater From ceebd1b2fa807802bef826b85d1c52a0f0579a23 Mon Sep 17 00:00:00 2001 From: gen740 Date: Wed, 6 Dec 2023 16:21:31 +0900 Subject: [PATCH 04/14] Add create study and delete study --- standalone_app/src/journalStorage.ts | 103 ++++++++++++++++++++++++++- 1 file changed, 102 insertions(+), 1 deletion(-) diff --git a/standalone_app/src/journalStorage.ts b/standalone_app/src/journalStorage.ts index afccdfea..ffe27aac 100644 --- a/standalone_app/src/journalStorage.ts +++ b/standalone_app/src/journalStorage.ts @@ -1,5 +1,6 @@ import { SetterOrUpdater } from "recoil" +// JournalStorage enum JournalOperation { CREATE_STUDY = 0, DELETE_STUDY = 1, @@ -13,10 +14,110 @@ enum JournalOperation { SET_TRIAL_SYSTEM_ATTR = 9, } +interface JournalOpBase { + op_code: JournalOperation + workor_id: string +} + +interface JournalOpCreateStudy extends JournalOpBase { + study_name: string + directions: number[] // TODO(gen740): introduce Study Direction enum +} + +interface JournalOpDeleteStudy extends JournalOpBase { + study_id: number +} + +interface JournalOpSetStudyUserAttr extends JournalOpBase { + study_id: number + user_attr: { [key: string]: any } +} + +interface JournalOpCreateTrial extends JournalOpBase { + study_id: number + datetime_start: string + params: TrialParam[] +} + export const loadJournalStorage = ( arrayBuffer: ArrayBuffer, setter: SetterOrUpdater ): void => { const decoder = new TextDecoder("utf-8") - console.log(decoder.decode(arrayBuffer)) + const logs = decoder.decode(arrayBuffer).split("\n") + let studies: Study[] = [] + let nextStudyId = 0 + for (let log of logs) { + if (log === "") { + continue + } + let parsedLog: JournalOpBase = JSON.parse(log) + switch (parsedLog.op_code) { + case JournalOperation.CREATE_STUDY: + const createStudyLog = parsedLog as JournalOpCreateStudy + studies.push({ + study_id: nextStudyId, + study_name: createStudyLog.study_name, + directions: [ + createStudyLog.directions[0] === 1 ? "minimize" : "maximize", + ], + union_search_space: [], + intersection_search_space: [], + union_user_attrs: [], + trials: [], + }) + nextStudyId++ + break + case JournalOperation.DELETE_STUDY: + const deleteStudyLog = parsedLog as JournalOpDeleteStudy + studies = studies.filter( + (item) => item.study_id != deleteStudyLog.study_id + ) + break + case JournalOperation.SET_STUDY_USER_ATTR: + // const setStudyUserAttrLog = parsedLog as JournalOpSetStudyUserAttr + // studies = studies.map((item) => { + // if (item.study_id === setStudyUserAttrLog.study_id) { + // return { + // ...item, + // union_user_attrs: Object.entries( + // setStudyUserAttrLog.user_attr + // ).map(([key, value]) => { + // return { + // key: key, + // value: value, + // } + // }), + // } + // } else { + // return item + // } + // }) + break + case JournalOperation.SET_STUDY_SYSTEM_ATTR: + break + case JournalOperation.CREATE_TRIAL: + const createTrialLog = parsedLog as JournalOpCreateTrial + let trials = studies.find( + (item) => item.study_id == createTrialLog.study_id + )?.trials + if (trials === undefined) { + return + } + trials.push({ + trial_id: trials.length, + number: 0, + study_id: createTrialLog.study_id, + state: "Running", + values: [], + params: [], + intermediate_values: [], + user_attrs: [], + datetime_start: new Date(createTrialLog.datetime_start), + }) + break + } + } + + setter((prev) => [...prev, ...studies]) } From 5af337ac6075db0a06ead08d06494bb412eaf61b Mon Sep 17 00:00:00 2001 From: Gen <54583542+gen740@users.noreply.github.com> Date: Fri, 8 Dec 2023 14:18:26 +0900 Subject: [PATCH 05/14] Parse trial params --- standalone_app/src/journalStorage.ts | 118 +++++++++++++++++++++------ 1 file changed, 91 insertions(+), 27 deletions(-) diff --git a/standalone_app/src/journalStorage.ts b/standalone_app/src/journalStorage.ts index ffe27aac..89dbc057 100644 --- a/standalone_app/src/journalStorage.ts +++ b/standalone_app/src/journalStorage.ts @@ -28,15 +28,61 @@ interface JournalOpDeleteStudy extends JournalOpBase { study_id: number } -interface JournalOpSetStudyUserAttr extends JournalOpBase { - study_id: number - user_attr: { [key: string]: any } -} - interface JournalOpCreateTrial extends JournalOpBase { study_id: number datetime_start: string - params: TrialParam[] + datetime_complete: string + distributions: { [key: string]: string } + params: { [key: string]: any } + user_attrs: { [key: string]: any } + system_attrs: { [key: string]: any } + state: number + intermediate_values: { [key: string]: number } + value?: number + values?: number[] +} + +const trialStateNumToTrialState = (state: number): TrialState => { + switch (state) { + case 0: + return "Running" + case 1: + return "Complete" + case 2: + return "Pruned" + case 3: + return "Fail" + case 4: + return "Waiting" + default: + return "Running" + } +} + +const parseDistribution = (distribution: string): Distribution => { + const distributionJson = JSON.parse(distribution) + if (distributionJson["name"] === "IntDistribution") { + return { + ...distributionJson["attributes"], + type: "IntDistribution", + } + } else if (distributionJson["name"] === "FloatDistribution") { + return { + ...distributionJson["attributes"], + type: "FloatDistribution", + } + } else { + return { + // TODO(gen740): support other types + type: "CategoricalDistribution", + choices: distributionJson["attributes"]["choices"].map((choice: any) => { + return { + pytype: "str", + value: choice.toString(), + } + }), + } + } } export const loadJournalStorage = ( @@ -75,26 +121,10 @@ export const loadJournalStorage = ( ) break case JournalOperation.SET_STUDY_USER_ATTR: - // const setStudyUserAttrLog = parsedLog as JournalOpSetStudyUserAttr - // studies = studies.map((item) => { - // if (item.study_id === setStudyUserAttrLog.study_id) { - // return { - // ...item, - // union_user_attrs: Object.entries( - // setStudyUserAttrLog.user_attr - // ).map(([key, value]) => { - // return { - // key: key, - // value: value, - // } - // }), - // } - // } else { - // return item - // } - // }) + // Unsupported set for study user_attr break case JournalOperation.SET_STUDY_SYSTEM_ATTR: + // Unsupported set for study system_attr break case JournalOperation.CREATE_TRIAL: const createTrialLog = parsedLog as JournalOpCreateTrial @@ -104,13 +134,47 @@ export const loadJournalStorage = ( if (trials === undefined) { return } + + let params: TrialParam[] = Object.entries(createTrialLog.params).map( + ([key, value]) => { + const distribution = parseDistribution( + createTrialLog.distributions[key] + ) + return { + name: key, + param_internal_value: value, + param_external_type: distribution.type, + param_external_value: (() => { + if (distribution.type === "FloatDistribution") { + return value.toString() + } else if (distribution.type === "IntDistribution") { + return value.toString() + } else { + return distribution.choices[value].value + } + })(), + distribution: distribution, + } + } + ) + + console.log(params); + trials.push({ trial_id: trials.length, number: 0, study_id: createTrialLog.study_id, - state: "Running", - values: [], - params: [], + state: trialStateNumToTrialState(createTrialLog.state), + values: (() => { + if (createTrialLog.value !== undefined) { + return [createTrialLog.value] + } else if (createTrialLog.values !== undefined) { + return createTrialLog.values + } else { + return undefined + } + })(), + params: params, intermediate_values: [], user_attrs: [], datetime_start: new Date(createTrialLog.datetime_start), From 9ebfa728393e18c198fa6aedf808de25636f0716 Mon Sep 17 00:00:00 2001 From: Gen <54583542+gen740@users.noreply.github.com> Date: Fri, 8 Dec 2023 16:47:07 +0900 Subject: [PATCH 06/14] Add applyCreateTrial --- standalone_app/src/journalStorage.ts | 231 ++++++++++++++++++--------- 1 file changed, 159 insertions(+), 72 deletions(-) diff --git a/standalone_app/src/journalStorage.ts b/standalone_app/src/journalStorage.ts index 89dbc057..8cea55a2 100644 --- a/standalone_app/src/journalStorage.ts +++ b/standalone_app/src/journalStorage.ts @@ -42,6 +42,13 @@ interface JournalOpCreateTrial extends JournalOpBase { values?: number[] } +interface JournalOpSetTrialParam extends JournalOpBase { + trial_id: number + param_name: string + param_value_internal: number + distribution: string +} + const trialStateNumToTrialState = (state: number): TrialState => { switch (state) { case 0: @@ -85,14 +92,159 @@ const parseDistribution = (distribution: string): Distribution => { } } +class JournalStorage { + private studies: Study[] = [] + private nextStudyId = 0 + private studyIdToTrialIDs: Map = new Map() + private trialIdToStudyId: Map = new Map() + private trialNumber = 0 + + public getStudies(): Study[] { + return this.studies + } + + public applyCreateStudy(log: JournalOpCreateStudy): void { + this.studies.push({ + study_id: this.nextStudyId, + study_name: log.study_name, + directions: [log.directions[0] === 1 ? "minimize" : "maximize"], + union_search_space: [], + intersection_search_space: [], + union_user_attrs: [], + trials: [], + }) + this.nextStudyId++ + } + + public applyDeleteStudy(log: JournalOpDeleteStudy): void { + this.studies = this.studies.filter((item) => item.study_id != log.study_id) + } + + public applyCreateTrial(log: JournalOpCreateTrial): void { + let thisStudy = this.studies.find((item) => item.study_id == log.study_id) + if (thisStudy === undefined) { + return + } + + let paramItems = Object.entries(log.params).map(([name, _]) => { + return name + }) + + paramItems.forEach((name) => { + if (!thisStudy!.union_search_space.find((item) => item.name === name)) { + thisStudy!.union_search_space = thisStudy!.union_search_space.concat({ + name: name, + }) + } + }) + + if (thisStudy.trials.length === 0) { + thisStudy.intersection_search_space = paramItems.map((value) => { + return { + name: value, + } + }) + } else { + thisStudy.intersection_search_space = + thisStudy.intersection_search_space.filter((value) => { + return paramItems.includes(value.name) + }) + } + + let params: TrialParam[] = Object.entries(log.params).map( + ([name, value]) => { + const distribution = parseDistribution(log.distributions[name]) + + return { + name: name, + param_internal_value: value, + param_external_type: distribution.type, + param_external_value: (() => { + if (distribution.type === "FloatDistribution") { + return value.toString() + } else if (distribution.type === "IntDistribution") { + return value.toString() + } else { + return distribution.choices[value].value + } + })(), + distribution: distribution, + } + } + ) + + const userAtter = Object.entries(log.user_attrs).map(([key, value]) => { + if (!thisStudy!.union_user_attrs.find((item) => item.key === key)) { + thisStudy!.union_user_attrs = thisStudy!.union_user_attrs.concat({ + key: key, + sortable: false, + }) + } + return { + key: key, + value: value, + } + }) + + // append trial id to studyIdToTrialIDs + this.studyIdToTrialIDs.set( + log.study_id, + this.studyIdToTrialIDs + .get(log.study_id) + ?.concat([this.trialNumber]) ?? [this.trialNumber] + ) + + this.trialIdToStudyId.set(this.trialNumber, log.study_id) + + thisStudy.trials.push({ + trial_id: this.trialNumber++, + number: this.studyIdToTrialIDs.get(log.study_id)?.length ?? 0, + study_id: log.study_id, + state: trialStateNumToTrialState(log.state), + values: (() => { + if (log.value !== undefined) { + return [log.value] + } else if (log.values !== undefined) { + return log.values + } else { + return undefined + } + })(), + params: params, + intermediate_values: [], + user_attrs: userAtter, + datetime_start: new Date(log.datetime_start), + }) + + } + + public applySetTrialParam(log: JournalOpSetTrialParam) { + let thisStudy = this.studies.find((item) => item.study_id == this.trialIdToStudyId.get(log.trial_id)) + if (thisStudy === undefined) { + return + } + + let thisTrial = thisStudy.trials.find((item) => item.trial_id == log.trial_id) + if (thisTrial === undefined) { + return + } + + + + + } + +} + export const loadJournalStorage = ( arrayBuffer: ArrayBuffer, setter: SetterOrUpdater ): void => { const decoder = new TextDecoder("utf-8") const logs = decoder.decode(arrayBuffer).split("\n") - let studies: Study[] = [] - let nextStudyId = 0 + + let journalStorage = new JournalStorage() + for (let log of logs) { if (log === "") { continue @@ -100,25 +252,10 @@ export const loadJournalStorage = ( let parsedLog: JournalOpBase = JSON.parse(log) switch (parsedLog.op_code) { case JournalOperation.CREATE_STUDY: - const createStudyLog = parsedLog as JournalOpCreateStudy - studies.push({ - study_id: nextStudyId, - study_name: createStudyLog.study_name, - directions: [ - createStudyLog.directions[0] === 1 ? "minimize" : "maximize", - ], - union_search_space: [], - intersection_search_space: [], - union_user_attrs: [], - trials: [], - }) - nextStudyId++ + journalStorage.applyCreateStudy(parsedLog as JournalOpCreateStudy) break case JournalOperation.DELETE_STUDY: - const deleteStudyLog = parsedLog as JournalOpDeleteStudy - studies = studies.filter( - (item) => item.study_id != deleteStudyLog.study_id - ) + journalStorage.applyDeleteStudy(parsedLog as JournalOpDeleteStudy) break case JournalOperation.SET_STUDY_USER_ATTR: // Unsupported set for study user_attr @@ -127,61 +264,11 @@ export const loadJournalStorage = ( // Unsupported set for study system_attr break case JournalOperation.CREATE_TRIAL: - const createTrialLog = parsedLog as JournalOpCreateTrial - let trials = studies.find( - (item) => item.study_id == createTrialLog.study_id - )?.trials - if (trials === undefined) { - return - } - - let params: TrialParam[] = Object.entries(createTrialLog.params).map( - ([key, value]) => { - const distribution = parseDistribution( - createTrialLog.distributions[key] - ) - return { - name: key, - param_internal_value: value, - param_external_type: distribution.type, - param_external_value: (() => { - if (distribution.type === "FloatDistribution") { - return value.toString() - } else if (distribution.type === "IntDistribution") { - return value.toString() - } else { - return distribution.choices[value].value - } - })(), - distribution: distribution, - } - } - ) - - console.log(params); - - trials.push({ - trial_id: trials.length, - number: 0, - study_id: createTrialLog.study_id, - state: trialStateNumToTrialState(createTrialLog.state), - values: (() => { - if (createTrialLog.value !== undefined) { - return [createTrialLog.value] - } else if (createTrialLog.values !== undefined) { - return createTrialLog.values - } else { - return undefined - } - })(), - params: params, - intermediate_values: [], - user_attrs: [], - datetime_start: new Date(createTrialLog.datetime_start), - }) + journalStorage.applyCreateTrial(parsedLog as JournalOpCreateTrial) break } } - setter((prev) => [...prev, ...studies]) + console.log(journalStorage.getStudies()) + setter((prev) => [...prev, ...journalStorage.getStudies()]) } From 85d2b30922949161b868123c5d9a0777ed861e03 Mon Sep 17 00:00:00 2001 From: gen740 Date: Mon, 11 Dec 2023 18:00:28 +0900 Subject: [PATCH 07/14] Add set trial param operation --- standalone_app/src/journalStorage.ts | 190 ++++++++++++++++----------- 1 file changed, 110 insertions(+), 80 deletions(-) diff --git a/standalone_app/src/journalStorage.ts b/standalone_app/src/journalStorage.ts index 8cea55a2..52d1a919 100644 --- a/standalone_app/src/journalStorage.ts +++ b/standalone_app/src/journalStorage.ts @@ -30,14 +30,14 @@ interface JournalOpDeleteStudy extends JournalOpBase { interface JournalOpCreateTrial extends JournalOpBase { study_id: number - datetime_start: string - datetime_complete: string - distributions: { [key: string]: string } - params: { [key: string]: any } - user_attrs: { [key: string]: any } - system_attrs: { [key: string]: any } - state: number - intermediate_values: { [key: string]: number } + datetime_start?: string + datetime_complete?: string + distributions?: { [key: string]: string } + params?: { [key: string]: any } + user_attrs?: { [key: string]: any } + system_attrs?: { [key: string]: any } + state?: number + intermediate_values?: { [key: string]: number } value?: number values?: number[] } @@ -96,10 +96,49 @@ class JournalStorage { private studies: Study[] = [] private nextStudyId = 0 private studyIdToTrialIDs: Map = new Map() - private trialIdToStudyId: Map = new Map() + private trialIdToStudyId: Map = new Map() private trialNumber = 0 public getStudies(): Study[] { + for (let study of this.studies) { + let unionUserAttrs: Set = new Set() + let unionSearchSpace: Set = new Set() + let intersectionSearchSpace: string[] = [] + + study.trials.forEach((trial, index) => { + for (let userAttr of trial.user_attrs) { + unionUserAttrs.add(userAttr.key) + } + for (let param of trial.params) { + unionSearchSpace.add(param.name) + } + if (index === 0) { + intersectionSearchSpace = Array.from(unionSearchSpace) + } else { + intersectionSearchSpace = intersectionSearchSpace.filter((name) => + trial.params.some((param) => param.name === name) + ) + } + }) + + study.union_user_attrs = Array.from(unionUserAttrs).map((key) => { + return { + key: key, + sortable: false, + } + }) + study.union_search_space = Array.from(unionSearchSpace).map((name) => { + return { + name: name, + } + }) + study.intersection_search_space = intersectionSearchSpace.map((name) => { + return { + name: name, + } + }) + } + return this.studies } @@ -126,81 +165,51 @@ class JournalStorage { return } - let paramItems = Object.entries(log.params).map(([name, _]) => { - return name - }) - - paramItems.forEach((name) => { - if (!thisStudy!.union_search_space.find((item) => item.name === name)) { - thisStudy!.union_search_space = thisStudy!.union_search_space.concat({ - name: name, - }) - } - }) - - if (thisStudy.trials.length === 0) { - thisStudy.intersection_search_space = paramItems.map((value) => { - return { - name: value, - } - }) - } else { - thisStudy.intersection_search_space = - thisStudy.intersection_search_space.filter((value) => { - return paramItems.includes(value.name) - }) - } - - let params: TrialParam[] = Object.entries(log.params).map( - ([name, value]) => { - const distribution = parseDistribution(log.distributions[name]) - - return { - name: name, - param_internal_value: value, - param_external_type: distribution.type, - param_external_value: (() => { - if (distribution.type === "FloatDistribution") { - return value.toString() - } else if (distribution.type === "IntDistribution") { - return value.toString() - } else { - return distribution.choices[value].value + let params: TrialParam[] = + log.params === undefined + ? [] + : Object.entries(log.params).map(([name, value]) => { + const distribution = parseDistribution(log.distributions![name]) + return { + name: name, + param_internal_value: value, + param_external_type: distribution.type, + param_external_value: (() => { + if (distribution.type === "FloatDistribution") { + return value.toString() + } else if (distribution.type === "IntDistribution") { + return value.toString() + } else { + return distribution.choices[value].value + } + })(), + distribution: distribution, } - })(), - distribution: distribution, - } - } - ) + }) - const userAtter = Object.entries(log.user_attrs).map(([key, value]) => { - if (!thisStudy!.union_user_attrs.find((item) => item.key === key)) { - thisStudy!.union_user_attrs = thisStudy!.union_user_attrs.concat({ - key: key, - sortable: false, - }) - } - return { - key: key, - value: value, - } - }) - - // append trial id to studyIdToTrialIDs this.studyIdToTrialIDs.set( log.study_id, - this.studyIdToTrialIDs - .get(log.study_id) - ?.concat([this.trialNumber]) ?? [this.trialNumber] + this.studyIdToTrialIDs.get(log.study_id)?.concat([this.trialNumber]) ?? [ + this.trialNumber, + ] ) this.trialIdToStudyId.set(this.trialNumber, log.study_id) + const userAtter = log.user_attrs + ? Object.entries(log.user_attrs).map(([key, value]) => { + return { + key: key, + value: value, + } + }) + : [] + thisStudy.trials.push({ trial_id: this.trialNumber++, number: this.studyIdToTrialIDs.get(log.study_id)?.length ?? 0, study_id: log.study_id, - state: trialStateNumToTrialState(log.state), + state: trialStateNumToTrialState(log.state ?? 0), values: (() => { if (log.value !== undefined) { return [log.value] @@ -213,27 +222,48 @@ class JournalStorage { params: params, intermediate_values: [], user_attrs: userAtter, - datetime_start: new Date(log.datetime_start), + datetime_start: log.datetime_start + ? new Date(log.datetime_start) + : undefined, + datetime_complete: log.datetime_complete + ? new Date(log.datetime_complete) + : undefined, }) - } public applySetTrialParam(log: JournalOpSetTrialParam) { - let thisStudy = this.studies.find((item) => item.study_id == this.trialIdToStudyId.get(log.trial_id)) + let thisStudy = this.studies.find( + (item) => item.study_id == this.trialIdToStudyId.get(log.trial_id) + ) if (thisStudy === undefined) { return } - let thisTrial = thisStudy.trials.find((item) => item.trial_id == log.trial_id) + let thisTrial = thisStudy.trials.find( + (item) => item.trial_id == log.trial_id + ) if (thisTrial === undefined) { return } - - - + // if (thisTrial.params.some((param) => param.name === log.param_name)) { + // thisTrial.params.find((param) => param.name === log.param_name)[0] = { + // name: log.param_name, + // param_internal_value: log.param_value_internal, + // param_external_type: "FloatDistribution", + // param_external_value: log.param_value_internal.toString(), + // distribution: parseDistribution(log.distribution), + // } + // } else { + thisTrial.params.push({ + name: log.param_name, + param_internal_value: log.param_value_internal, + param_external_type: "FloatDistribution", + param_external_value: log.param_value_internal.toString(), + distribution: parseDistribution(log.distribution), + }) + // } } - } export const loadJournalStorage = ( From c51bb8297268ad096c6ee943f9077c1f6ba81567 Mon Sep 17 00:00:00 2001 From: gen740 Date: Fri, 15 Dec 2023 16:32:55 +0900 Subject: [PATCH 08/14] Support journal storage loader --- standalone_app/src/journalStorage.ts | 153 ++++++++++++++++++++------- 1 file changed, 114 insertions(+), 39 deletions(-) diff --git a/standalone_app/src/journalStorage.ts b/standalone_app/src/journalStorage.ts index 52d1a919..dd9164bd 100644 --- a/standalone_app/src/journalStorage.ts +++ b/standalone_app/src/journalStorage.ts @@ -49,6 +49,25 @@ interface JournalOpSetTrialParam extends JournalOpBase { distribution: string } +interface JournalOpSetTrialStateValue extends JournalOpBase { + trial_id: number + state: number + values?: number[] + datetime_start?: string + datetime_complete?: string +} + +interface JournalOpSetTrialIntermediateValue extends JournalOpBase { + trial_id: number + step: number + intermediate_value: number +} + +interface JournalOpSetTrialUserAttr extends JournalOpBase { + trial_id: number + user_attr: { [key: string]: any } +} + const trialStateNumToTrialState = (state: number): TrialState => { switch (state) { case 0: @@ -97,7 +116,7 @@ class JournalStorage { private nextStudyId = 0 private studyIdToTrialIDs: Map = new Map() private trialIdToStudyId: Map = new Map() - private trialNumber = 0 + private trialID = 0 public getStudies(): Study[] { for (let study of this.studies) { @@ -107,6 +126,7 @@ class JournalStorage { study.trials.forEach((trial, index) => { for (let userAttr of trial.user_attrs) { + console.log(userAttr.key) unionUserAttrs.add(userAttr.key) } for (let param of trial.params) { @@ -115,12 +135,11 @@ class JournalStorage { if (index === 0) { intersectionSearchSpace = Array.from(unionSearchSpace) } else { - intersectionSearchSpace = intersectionSearchSpace.filter((name) => - trial.params.some((param) => param.name === name) - ) + intersectionSearchSpace = intersectionSearchSpace.filter((name) => { + return trial.params.some((param) => param.name === name) + }) } }) - study.union_user_attrs = Array.from(unionUserAttrs).map((key) => { return { key: key, @@ -187,15 +206,6 @@ class JournalStorage { } }) - this.studyIdToTrialIDs.set( - log.study_id, - this.studyIdToTrialIDs.get(log.study_id)?.concat([this.trialNumber]) ?? [ - this.trialNumber, - ] - ) - - this.trialIdToStudyId.set(this.trialNumber, log.study_id) - const userAtter = log.user_attrs ? Object.entries(log.user_attrs).map(([key, value]) => { return { @@ -206,7 +216,7 @@ class JournalStorage { : [] thisStudy.trials.push({ - trial_id: this.trialNumber++, + trial_id: this.trialID, number: this.studyIdToTrialIDs.get(log.study_id)?.length ?? 0, study_id: log.study_id, state: trialStateNumToTrialState(log.state ?? 0), @@ -229,40 +239,84 @@ class JournalStorage { ? new Date(log.datetime_complete) : undefined, }) + this.studyIdToTrialIDs.set( + log.study_id, + this.studyIdToTrialIDs.get(log.study_id)?.concat([this.trialID]) ?? [ + this.trialID, + ] + ) + this.trialIdToStudyId.set(this.trialID, log.study_id) + this.trialID++ + } + + private getStudyAndTrial(trial_id: number): [Study?, Trial?] { + let study = this.studies.find( + (item) => item.study_id == this.trialIdToStudyId.get(trial_id) + ) + if (study === undefined) { + return [undefined, undefined] + } + + const trial = study.trials.find((item) => item.trial_id == trial_id) + if (trial === undefined) { + return [study, undefined] + } + return [study, trial] } public applySetTrialParam(log: JournalOpSetTrialParam) { - let thisStudy = this.studies.find( - (item) => item.study_id == this.trialIdToStudyId.get(log.trial_id) - ) - if (thisStudy === undefined) { + let [thisStudy, thisTrial] = this.getStudyAndTrial(log.trial_id) + if (thisStudy === undefined || thisTrial === undefined) { return } + thisTrial.params.push({ + name: log.param_name, + param_internal_value: log.param_value_internal, + param_external_type: "FloatDistribution", + param_external_value: log.param_value_internal.toString(), + distribution: parseDistribution(log.distribution), + }) + } - let thisTrial = thisStudy.trials.find( - (item) => item.trial_id == log.trial_id - ) - if (thisTrial === undefined) { + public applySetTrialStateValues(log: JournalOpSetTrialStateValue): void { + let [thisStudy, thisTrial] = this.getStudyAndTrial(log.trial_id) + if (thisStudy === undefined || thisTrial === undefined) { return } + thisTrial.state = trialStateNumToTrialState(log.state) + thisTrial.values = log.values + thisTrial.datetime_start = log.datetime_start + ? new Date(log.datetime_start) + : undefined + thisTrial.datetime_complete = log.datetime_complete + ? new Date(log.datetime_complete) + : undefined + } - // if (thisTrial.params.some((param) => param.name === log.param_name)) { - // thisTrial.params.find((param) => param.name === log.param_name)[0] = { - // name: log.param_name, - // param_internal_value: log.param_value_internal, - // param_external_type: "FloatDistribution", - // param_external_value: log.param_value_internal.toString(), - // distribution: parseDistribution(log.distribution), - // } - // } else { - thisTrial.params.push({ - name: log.param_name, - param_internal_value: log.param_value_internal, - param_external_type: "FloatDistribution", - param_external_value: log.param_value_internal.toString(), - distribution: parseDistribution(log.distribution), + public applySetTrialIntermediateValue( + log: JournalOpSetTrialIntermediateValue + ) { + let [thisStudy, thisTrial] = this.getStudyAndTrial(log.trial_id) + if (thisStudy === undefined || thisTrial === undefined) { + return + } + thisTrial.intermediate_values.push({ + step: log.step, + value: log.intermediate_value, + }) + } + + public applySetTrialUserAttr(log: JournalOpSetTrialUserAttr) { + let [thisStudy, thisTrial] = this.getStudyAndTrial(log.trial_id) + if (thisStudy === undefined || thisTrial === undefined) { + return + } + for (let [key, value] of Object.entries(log.user_attr)) { + thisTrial.user_attrs.push({ + key: key, + value: value.toString(), }) - // } + } } } @@ -296,6 +350,27 @@ export const loadJournalStorage = ( case JournalOperation.CREATE_TRIAL: journalStorage.applyCreateTrial(parsedLog as JournalOpCreateTrial) break + case JournalOperation.SET_TRIAL_PARAM: + journalStorage.applySetTrialParam(parsedLog as JournalOpSetTrialParam) + break + case JournalOperation.SET_TRIAL_STATE_VALUES: + journalStorage.applySetTrialStateValues( + parsedLog as JournalOpSetTrialStateValue + ) + break + case JournalOperation.SET_TRIAL_INTERMEDIATE_VALUE: + journalStorage.applySetTrialIntermediateValue( + parsedLog as JournalOpSetTrialIntermediateValue + ) + break + case JournalOperation.SET_TRIAL_USER_ATTR: + journalStorage.applySetTrialUserAttr( + parsedLog as JournalOpSetTrialUserAttr + ) + break + case JournalOperation.SET_TRIAL_SYSTEM_ATTR: + // Unsupported set for trial system_attr + break } } From 932b8cf702cb9ba04b9222d7529116170249743a Mon Sep 17 00:00:00 2001 From: gen740 Date: Sun, 17 Dec 2023 11:55:10 +0900 Subject: [PATCH 09/14] Fix eslint error --- .../src/components/StorageLoader.tsx | 2 +- standalone_app/src/journalStorage.ts | 51 ++++++++++--------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/standalone_app/src/components/StorageLoader.tsx b/standalone_app/src/components/StorageLoader.tsx index 65d139b0..47a023cc 100644 --- a/standalone_app/src/components/StorageLoader.tsx +++ b/standalone_app/src/components/StorageLoader.tsx @@ -32,7 +32,7 @@ export const StorageLoader: FC = () => { const arrayBuffer = r.result as ArrayBuffer | null const fileExtension = file.name.split(".").pop() if (arrayBuffer !== null) { - if (fileExtension == "log") { + if (fileExtension === "log") { loadJournalStorage(arrayBuffer, setStudies) } else { loadSQLite3Storage(arrayBuffer, setStudies) diff --git a/standalone_app/src/journalStorage.ts b/standalone_app/src/journalStorage.ts index dd9164bd..0e4cde33 100644 --- a/standalone_app/src/journalStorage.ts +++ b/standalone_app/src/journalStorage.ts @@ -33,9 +33,9 @@ interface JournalOpCreateTrial extends JournalOpBase { datetime_start?: string datetime_complete?: string distributions?: { [key: string]: string } - params?: { [key: string]: any } - user_attrs?: { [key: string]: any } - system_attrs?: { [key: string]: any } + params?: { [key: string]: any } // eslint-disable-line @typescript-eslint/no-explicit-any + user_attrs?: { [key: string]: any } // eslint-disable-line @typescript-eslint/no-explicit-any + system_attrs?: { [key: string]: any } // eslint-disable-line @typescript-eslint/no-explicit-any state?: number intermediate_values?: { [key: string]: number } value?: number @@ -65,7 +65,7 @@ interface JournalOpSetTrialIntermediateValue extends JournalOpBase { interface JournalOpSetTrialUserAttr extends JournalOpBase { trial_id: number - user_attr: { [key: string]: any } + user_attr: { [key: string]: any } // eslint-disable-line @typescript-eslint/no-explicit-any } const trialStateNumToTrialState = (state: number): TrialState => { @@ -101,6 +101,7 @@ const parseDistribution = (distribution: string): Distribution => { return { // TODO(gen740): support other types type: "CategoricalDistribution", + // eslint-disable-next-line @typescript-eslint/no-explicit-any choices: distributionJson["attributes"]["choices"].map((choice: any) => { return { pytype: "str", @@ -119,17 +120,17 @@ class JournalStorage { private trialID = 0 public getStudies(): Study[] { - for (let study of this.studies) { - let unionUserAttrs: Set = new Set() - let unionSearchSpace: Set = new Set() + for (const study of this.studies) { + const unionUserAttrs: Set = new Set() + const unionSearchSpace: Set = new Set() let intersectionSearchSpace: string[] = [] study.trials.forEach((trial, index) => { - for (let userAttr of trial.user_attrs) { + for (const userAttr of trial.user_attrs) { console.log(userAttr.key) unionUserAttrs.add(userAttr.key) } - for (let param of trial.params) { + for (const param of trial.params) { unionSearchSpace.add(param.name) } if (index === 0) { @@ -175,17 +176,19 @@ class JournalStorage { } public applyDeleteStudy(log: JournalOpDeleteStudy): void { - this.studies = this.studies.filter((item) => item.study_id != log.study_id) + this.studies = this.studies.filter((item) => item.study_id !== log.study_id) } public applyCreateTrial(log: JournalOpCreateTrial): void { - let thisStudy = this.studies.find((item) => item.study_id == log.study_id) + const thisStudy = this.studies.find( + (item) => item.study_id === log.study_id + ) if (thisStudy === undefined) { return } - let params: TrialParam[] = - log.params === undefined + const params: TrialParam[] = + log.params === undefined || log.distributions === undefined ? [] : Object.entries(log.params).map(([name, value]) => { const distribution = parseDistribution(log.distributions![name]) @@ -250,14 +253,14 @@ class JournalStorage { } private getStudyAndTrial(trial_id: number): [Study?, Trial?] { - let study = this.studies.find( - (item) => item.study_id == this.trialIdToStudyId.get(trial_id) + const study = this.studies.find( + (item) => item.study_id === this.trialIdToStudyId.get(trial_id) ) if (study === undefined) { return [undefined, undefined] } - const trial = study.trials.find((item) => item.trial_id == trial_id) + const trial = study.trials.find((item) => item.trial_id === trial_id) if (trial === undefined) { return [study, undefined] } @@ -265,7 +268,7 @@ class JournalStorage { } public applySetTrialParam(log: JournalOpSetTrialParam) { - let [thisStudy, thisTrial] = this.getStudyAndTrial(log.trial_id) + const [thisStudy, thisTrial] = this.getStudyAndTrial(log.trial_id) if (thisStudy === undefined || thisTrial === undefined) { return } @@ -279,7 +282,7 @@ class JournalStorage { } public applySetTrialStateValues(log: JournalOpSetTrialStateValue): void { - let [thisStudy, thisTrial] = this.getStudyAndTrial(log.trial_id) + const [thisStudy, thisTrial] = this.getStudyAndTrial(log.trial_id) if (thisStudy === undefined || thisTrial === undefined) { return } @@ -296,7 +299,7 @@ class JournalStorage { public applySetTrialIntermediateValue( log: JournalOpSetTrialIntermediateValue ) { - let [thisStudy, thisTrial] = this.getStudyAndTrial(log.trial_id) + const [thisStudy, thisTrial] = this.getStudyAndTrial(log.trial_id) if (thisStudy === undefined || thisTrial === undefined) { return } @@ -307,11 +310,11 @@ class JournalStorage { } public applySetTrialUserAttr(log: JournalOpSetTrialUserAttr) { - let [thisStudy, thisTrial] = this.getStudyAndTrial(log.trial_id) + const [thisStudy, thisTrial] = this.getStudyAndTrial(log.trial_id) if (thisStudy === undefined || thisTrial === undefined) { return } - for (let [key, value] of Object.entries(log.user_attr)) { + for (const [key, value] of Object.entries(log.user_attr)) { thisTrial.user_attrs.push({ key: key, value: value.toString(), @@ -327,13 +330,13 @@ export const loadJournalStorage = ( const decoder = new TextDecoder("utf-8") const logs = decoder.decode(arrayBuffer).split("\n") - let journalStorage = new JournalStorage() + const journalStorage = new JournalStorage() - for (let log of logs) { + for (const log of logs) { if (log === "") { continue } - let parsedLog: JournalOpBase = JSON.parse(log) + const parsedLog: JournalOpBase = JSON.parse(log) switch (parsedLog.op_code) { case JournalOperation.CREATE_STUDY: journalStorage.applyCreateStudy(parsedLog as JournalOpCreateStudy) From 38092c98f5ea310f96b48753de61990e9bc1faa5 Mon Sep 17 00:00:00 2001 From: gen740 Date: Tue, 19 Dec 2023 17:55:11 +0900 Subject: [PATCH 10/14] Delete unnecessary console.log --- standalone_app/src/journalStorage.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/standalone_app/src/journalStorage.ts b/standalone_app/src/journalStorage.ts index 0e4cde33..6a252999 100644 --- a/standalone_app/src/journalStorage.ts +++ b/standalone_app/src/journalStorage.ts @@ -127,7 +127,6 @@ class JournalStorage { study.trials.forEach((trial, index) => { for (const userAttr of trial.user_attrs) { - console.log(userAttr.key) unionUserAttrs.add(userAttr.key) } for (const param of trial.params) { @@ -377,6 +376,5 @@ export const loadJournalStorage = ( } } - console.log(journalStorage.getStudies()) setter((prev) => [...prev, ...journalStorage.getStudies()]) } From a8cddd5b84c38852686e955cbb8f2641ad758fec Mon Sep 17 00:00:00 2001 From: gen740 Date: Fri, 22 Dec 2023 14:07:56 +0900 Subject: [PATCH 11/14] Detect file format by reading header of arrayBuffer --- .../src/components/StorageLoader.tsx | 9 +++---- standalone_app/src/journalStorage.ts | 3 ++- standalone_app/src/sqlite3.ts | 24 +++++++++---------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/standalone_app/src/components/StorageLoader.tsx b/standalone_app/src/components/StorageLoader.tsx index 47a023cc..8c0d20c0 100644 --- a/standalone_app/src/components/StorageLoader.tsx +++ b/standalone_app/src/components/StorageLoader.tsx @@ -30,12 +30,13 @@ export const StorageLoader: FC = () => { const r = new FileReader() r.addEventListener("load", () => { const arrayBuffer = r.result as ArrayBuffer | null - const fileExtension = file.name.split(".").pop() if (arrayBuffer !== null) { - if (fileExtension === "log") { - loadJournalStorage(arrayBuffer, setStudies) - } else { + const header = new Uint8Array(arrayBuffer, 0, 16) + const headerString = new TextDecoder().decode(header) + if (headerString === "SQLite format 3\u0000") { loadSQLite3Storage(arrayBuffer, setStudies) + } else { + loadJournalStorage(arrayBuffer, setStudies) } } }) diff --git a/standalone_app/src/journalStorage.ts b/standalone_app/src/journalStorage.ts index 6a252999..994ee21b 100644 --- a/standalone_app/src/journalStorage.ts +++ b/standalone_app/src/journalStorage.ts @@ -376,5 +376,6 @@ export const loadJournalStorage = ( } } - setter((prev) => [...prev, ...journalStorage.getStudies()]) + const studies = journalStorage.getStudies() + setter((prev) => [...prev, ...studies]) } diff --git a/standalone_app/src/sqlite3.ts b/standalone_app/src/sqlite3.ts index d01a7e52..a0bf018b 100644 --- a/standalone_app/src/sqlite3.ts +++ b/standalone_app/src/sqlite3.ts @@ -174,12 +174,12 @@ const getTrials = ( vals[2] === "COMPLETE" ? "Complete" : vals[2] === "PRUNED" - ? "Pruned" - : vals[2] === "RUNNING" - ? "Running" - : vals[2] === "WAITING" - ? "Waiting" - : "Fail" + ? "Pruned" + : vals[2] === "RUNNING" + ? "Running" + : vals[2] === "WAITING" + ? "Waiting" + : "Fail" const trial: Trial = { trial_id: trialId, number: vals[1], @@ -220,8 +220,8 @@ const getTrialValues = ( vals[1] === "INF_NEG" ? "-inf" : vals[1] === "INF_POS" - ? "+inf" - : vals[0] + ? "+inf" + : vals[0] ) }, }) @@ -391,10 +391,10 @@ const getTrialIntermediateValues = ( vals[2] === "INF_NEG" ? "-inf" : vals[2] === "INF_POS" - ? "+inf" - : vals[2] === "NAN" - ? "nan" - : vals[1], + ? "+inf" + : vals[2] === "NAN" + ? "nan" + : vals[1], }) }, }) From 583115798d0ee910a33f4c26efba0aff034e0351 Mon Sep 17 00:00:00 2001 From: gen740 Date: Fri, 22 Dec 2023 14:44:50 +0900 Subject: [PATCH 12/14] Format code --- standalone_app/src/journalStorage.ts | 19 ++++++++++++------- standalone_app/src/sqlite3.ts | 24 ++++++++++++------------ 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/standalone_app/src/journalStorage.ts b/standalone_app/src/journalStorage.ts index 994ee21b..64a32f7b 100644 --- a/standalone_app/src/journalStorage.ts +++ b/standalone_app/src/journalStorage.ts @@ -314,10 +314,15 @@ class JournalStorage { return } for (const [key, value] of Object.entries(log.user_attr)) { - thisTrial.user_attrs.push({ - key: key, - value: value.toString(), - }) + const index = thisTrial.user_attrs.findIndex((item) => item.key === key) + if (index !== -1) { + thisTrial.user_attrs[index].value = value.toString() + } else { + thisTrial.user_attrs.push({ + key: key, + value: value.toString(), + }) + } } } } @@ -344,10 +349,10 @@ export const loadJournalStorage = ( journalStorage.applyDeleteStudy(parsedLog as JournalOpDeleteStudy) break case JournalOperation.SET_STUDY_USER_ATTR: - // Unsupported set for study user_attr + // Unsupported break case JournalOperation.SET_STUDY_SYSTEM_ATTR: - // Unsupported set for study system_attr + // Unsupported break case JournalOperation.CREATE_TRIAL: journalStorage.applyCreateTrial(parsedLog as JournalOpCreateTrial) @@ -371,7 +376,7 @@ export const loadJournalStorage = ( ) break case JournalOperation.SET_TRIAL_SYSTEM_ATTR: - // Unsupported set for trial system_attr + // Unsupported break } } diff --git a/standalone_app/src/sqlite3.ts b/standalone_app/src/sqlite3.ts index a0bf018b..d01a7e52 100644 --- a/standalone_app/src/sqlite3.ts +++ b/standalone_app/src/sqlite3.ts @@ -174,12 +174,12 @@ const getTrials = ( vals[2] === "COMPLETE" ? "Complete" : vals[2] === "PRUNED" - ? "Pruned" - : vals[2] === "RUNNING" - ? "Running" - : vals[2] === "WAITING" - ? "Waiting" - : "Fail" + ? "Pruned" + : vals[2] === "RUNNING" + ? "Running" + : vals[2] === "WAITING" + ? "Waiting" + : "Fail" const trial: Trial = { trial_id: trialId, number: vals[1], @@ -220,8 +220,8 @@ const getTrialValues = ( vals[1] === "INF_NEG" ? "-inf" : vals[1] === "INF_POS" - ? "+inf" - : vals[0] + ? "+inf" + : vals[0] ) }, }) @@ -391,10 +391,10 @@ const getTrialIntermediateValues = ( vals[2] === "INF_NEG" ? "-inf" : vals[2] === "INF_POS" - ? "+inf" - : vals[2] === "NAN" - ? "nan" - : vals[1], + ? "+inf" + : vals[2] === "NAN" + ? "nan" + : vals[1], }) }, }) From dcc0c897edbaefb26efd7ecd3bae4307ab394dbb Mon Sep 17 00:00:00 2001 From: gen740 Date: Fri, 22 Dec 2023 15:01:29 +0900 Subject: [PATCH 13/14] Add loadJournalStorage to vscode_entry.tsx --- standalone_app/src/vscode_entry.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/standalone_app/src/vscode_entry.tsx b/standalone_app/src/vscode_entry.tsx index 8eac5b4c..65869235 100644 --- a/standalone_app/src/vscode_entry.tsx +++ b/standalone_app/src/vscode_entry.tsx @@ -5,6 +5,7 @@ import { App } from "./components/App" import { RecoilRoot, useSetRecoilState, SetterOrUpdater } from "recoil" import { studiesState } from "./state" import { loadSQLite3Storage } from "./sqlite3" +import { loadJournalStorage } from "./journalStorage" export const AppWrapper: FC = () => { const setStudies = useSetRecoilState(studiesState) @@ -35,7 +36,13 @@ export const AppWrapper: FC = () => { bytes[i] = binaryString.charCodeAt(i) } arrayBuffer = bytes.buffer - loadSQLite3Storage(arrayBuffer, onceSetStudies) + const header = new Uint8Array(arrayBuffer, 0, 16) + const headerString = new TextDecoder().decode(header) + if (headerString === "SQLite format 3\u0000") { + loadSQLite3Storage(arrayBuffer, setStudies) + } else { + loadJournalStorage(arrayBuffer, setStudies) + } break } }) From 48629d3b1a33c7bbe44864fdc568cfedf0b77ee7 Mon Sep 17 00:00:00 2001 From: gen740 Date: Fri, 22 Dec 2023 15:06:41 +0900 Subject: [PATCH 14/14] Lint --- standalone_app/src/vscode_entry.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/standalone_app/src/vscode_entry.tsx b/standalone_app/src/vscode_entry.tsx index 65869235..31ea25eb 100644 --- a/standalone_app/src/vscode_entry.tsx +++ b/standalone_app/src/vscode_entry.tsx @@ -25,6 +25,8 @@ export const AppWrapper: FC = () => { let len: number let bytes: Uint8Array let arrayBuffer: ArrayBuffer + let header: Uint8Array + let headerString: string switch (message.type) { case "optunaStorage": @@ -36,12 +38,12 @@ export const AppWrapper: FC = () => { bytes[i] = binaryString.charCodeAt(i) } arrayBuffer = bytes.buffer - const header = new Uint8Array(arrayBuffer, 0, 16) - const headerString = new TextDecoder().decode(header) + header = new Uint8Array(arrayBuffer, 0, 16) + headerString = new TextDecoder().decode(header) if (headerString === "SQLite format 3\u0000") { - loadSQLite3Storage(arrayBuffer, setStudies) + loadSQLite3Storage(arrayBuffer, onceSetStudies) } else { - loadJournalStorage(arrayBuffer, setStudies) + loadJournalStorage(arrayBuffer, onceSetStudies) } break }