From 853e37a9dc93b7db9576e4d1aa20ee0749b72473 Mon Sep 17 00:00:00 2001 From: v-liguo Date: Mon, 15 Apr 2019 13:55:43 +0800 Subject: [PATCH 1/8] optimization of copy as python --- src/webui/public/icon.png | Bin 30656 -> 2287 bytes src/webui/src/components/Control.tsx | 395 ------------------ .../src/components/overview/Progress.tsx | 2 + .../src/components/overview/SuccessTable.tsx | 4 +- .../src/components/public-child/OpenRow.tsx | 111 +++-- .../src/components/trial-detail/TableList.tsx | 14 +- src/webui/src/index.tsx | 2 - src/webui/src/static/const.ts | 4 +- src/webui/src/static/function.ts | 1 + .../style/{tableList.scss => openRow.scss} | 28 +- src/webui/src/static/style/progress.scss | 2 +- src/webui/src/static/style/table.scss | 13 +- src/webui/src/static/style/tableStatus.css | 1 + 13 files changed, 117 insertions(+), 460 deletions(-) delete mode 100644 src/webui/src/components/Control.tsx rename src/webui/src/static/style/{tableList.scss => openRow.scss} (62%) diff --git a/src/webui/public/icon.png b/src/webui/public/icon.png index 98c8666eb76b766851c6c456dc845644efa8ffb3..60d73744b37d6fb1d70514abdf6ed7d371d71e85 100644 GIT binary patch literal 2287 zcmc&$`#;lr7*~#CN0cOKM?z;clNDO1+}4QEY%{)MI4oKdmV2Byjc943V=jp>S!=VE zvNa^frRiA5r8X)}&83@!lWU~2&OdQ}c%Jv``8=QJ^}L_U>-G82v6v%zI$#|Q4Gldn zPZVB_CEo?~qgoqR{&hwTKT$o8C1_~CcYK#MskJW28XBN#FO(Z0wS2O|DURrFn6pc~ zk>=@O%XW*<-2BkU3rsHfJ!ha;WB|F$wKm7~H`Zt^X%`sP+xBdCt-g-N*A+lL?;tJC zJ*xLY{cdI?Nb+r{U-)#*E@8MaVQ}iH19PhD@yF)3jjt9SllSRln+1+=4GeX+oNJ?Q zH2$B!>Roln&w+*h$ zZc+G^#mca_ucpXFGP>%2ZZ;%Wo+Aal&@IwO3^Qp`O(`0@OhXm54rXIR7)0=h>lfQhC94_1u}nWGcR7D zu3 zCiW#~p0LZy7!W6SO+G2tzF*&Z_l#LO<)1%oBdRfyK8+x|f)8 z2le3c$ef&+En`+4v!fvyi{tHz#ZbT}&7syQJ!enc^vA*yBN7W5=qtA118A25@{q{> zn8;!%^}*B0#`5^+L&OfZZ)G!8+kYW$RM@kO;p5-_?ie?CH%5iPaJO|eD7X5XV&Y3l z>9V~Ko=Oq(19l~vJkuiCVF-j2E%Y0sUYE4W@RF}oF;6%SF zK7d^i!eF8=H9E45Mi+aw-Sb53j7g~_z_Zb1*qS2>@C4~>O!VMqa*H?wxMAWT*fF8$ zeNhKEOlg=WmC^Pyzs~-dkZu(fWZvY9Q?0ecJ>p0~kessl#vEBN9T|&|2EfOL{V|9j z`#@hP7q2@1VKAj)|HqAJ!#g+YB~*9r%va34l;LNlZ8h7wG(X^4^wl0Gnal)!+dyk# zwi0}!gh7plp0KR{loH)+hW07ng=W|kS#_=HGNClA53HauwZolo3{ObZ*<#?biYF&G zT7MO&7s!Oh4fa6KAz?O=p$U~fs_yHkwxAX{*8w8iJJ}9Yx-BGr#h7iJ~20dK79Cd4)IMqYgqF{-NN$#2jFDZ9~{;Dyt0q zir;S%B4b0Ru{EOYDHIlztT`nD-m8}cKe`}&PN1A}mz2xN{v(ew9C-C!YEtR3%_nmB z`VgId$|V9j>gPTNf(Br)2@Pjv-wnr4ri{S<%TfSQMlB4%J|jJ(E1UM^kfnLIK)HX zcT+0gLr)%#8Ba_qS$3TvkgPhi@Fcv8E=BIV*g1D5%!4Rj^pOOyQEkDDqsrL=(lN&Y zr-MXmT!g&oEw_Kddjw(1fa0d{r09gn4EVVywUgS{8gbLmPacSuT*Q9AGmy(iDzA|!+2zJPi#~Tu z0+;`p6~Vo&0k%HhZ5fVg*t`c%FNl< z+S4NZz-e{okSs93yE_|3e%n3sLFp+LZSQ-hu!lP@bbXyFU~JV+iHTmogWQ%6S;>-? z8=o^l&nE3^`nj*2FYh0nOU^)I{`}t_YhCl~Z);@X1s@3wm;2N|7!5CX3`&UnmG&<@ CLnI&o literal 30656 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 diff --git a/src/webui/src/components/Control.tsx b/src/webui/src/components/Control.tsx deleted file mode 100644 index db53e337b5..0000000000 --- a/src/webui/src/components/Control.tsx +++ /dev/null @@ -1,395 +0,0 @@ -import * as React from 'react'; -import { Input, Button, message } from 'antd'; -import axios from 'axios'; -import { MANAGER_IP, CONTROLTYPE } from '../static/const'; -const { TextArea } = Input; -import '../static/style/control.scss'; - -interface ExperimentParams { - authorName: string; - experimentName: string; - trialConcurrency: number; - maxExecDuration: number; - maxTrialNum: number; - searchSpace: string; - tuner: { - tunerCommand: string; - tunerCwd: string; - tunerCheckpointDirectory: string; - tunerGpuNum?: number; - }; - assessor?: { - assessorCommand: string; - assessorCwd: string; - assessorCheckpointDirectory: string; - assessorGpuNum?: number; - }; -} - -interface Experiments { - params: ExperimentParams; - id: string; - startTime?: Date; - endTime?: Date; - revision: number; - execDuration: number; -} - -interface TrialNumber { - maxExecDuration: number; - trialConcurrency: number; -} - -interface ControlState { - addisabled: boolean; - addTrial: string; - updateSearch: string; - trialNum: TrialNumber; - trialMess: string; - updisabled: boolean; - upTrialdis: boolean; - experiment: Experiments; -} - -class Control extends React.Component<{}, ControlState> { - - public _isMounted = false; - - constructor(props: {}) { - - super(props); - this.state = { - addisabled: false, - upTrialdis: false, - addTrial: '', - updateSearch: '', - updisabled: false, - trialNum: { - maxExecDuration: 0, - trialConcurrency: 0 - }, - trialMess: '', - // experiment origin data obj - experiment: { - params: { - authorName: '', - experimentName: '', - trialConcurrency: 0, - maxExecDuration: 0, - maxTrialNum: 0, - searchSpace: '', - tuner: { - tunerCommand: '', - tunerCwd: '', - tunerCheckpointDirectory: '', - } - }, - id: '', - revision: 0, - execDuration: 0, - } - }; - } - - updateTrialNumLoad = () => { - if (this._isMounted) { - this.setState({ - upTrialdis: true, - }); - } - } - - updateTrialNumNormal = () => { - if (this._isMounted) { - this.setState({ - upTrialdis: false, - }); - } - } - - addButtonLoad = () => { - if (this._isMounted) { - this.setState({ - addisabled: true - }); - } - } - - addButtonNormal = () => { - if (this._isMounted) { - this.setState({ - addisabled: false, - }); - } - } - - updateSearchLoad = () => { - if (this._isMounted) { - this.setState({ - updisabled: true, - }); - } - } - - updateSearchNormal = () => { - if (this._isMounted) { - this.setState({ - updisabled: false, - }); - } - } - - getTrialNum = (event: React.ChangeEvent) => { - if (this._isMounted) { - this.setState({ - trialMess: event.target.value - }); - } - } - - getAddTrialval = (event: React.ChangeEvent) => { - if (this._isMounted) { - this.setState({ - addTrial: event.target.value - }); - } - } - - updateSearchCon = (event: React.ChangeEvent) => { - if (this._isMounted) { - this.setState({ - updateSearch: event.target.value - }); - } - } - - // get add trial example - getAddExample = () => { - axios(`${MANAGER_IP}/trial-jobs`, { - method: 'GET' - }).then(res => { - if (res.status === 200 && this._isMounted) { - if (res.data.length !== 0) { - const addTrialExam = JSON.parse(res.data[0].hyperParameters).parameters; - this.setState({ - addTrial: JSON.stringify(addTrialExam, null, 4) - }); - } - } - }); - } - - // get update search_space file and experiment - getUpdateExample = () => { - axios(`${MANAGER_IP}/experiment`, { - method: 'GET' - }).then(res => { - if (res.status === 200 && this._isMounted) { - const sespaceExam = JSON.parse(res.data.params.searchSpace); - const trialnum: Array = []; - trialnum.push({ - maxExecDuration: res.data.params.maxExecDuration, - trialConcurrency: res.data.params.trialConcurrency - }); - this.setState(() => ({ - updateSearch: JSON.stringify(sespaceExam, null, 4), - trialNum: trialnum[0], - trialMess: JSON.stringify(trialnum[0], null, 4), - experiment: res.data - })); - } - }); - } - - // update trial number parameters - trialParameterMess = (exper: Experiments, str: string) => { - - axios(`${MANAGER_IP}/experiment`, { - method: 'PUT', - headers: { - 'Content-Type': 'application/json;charset=utf-8' - }, - data: exper, - params: { - update_type: str, - } - }).then(res => { - if (res.status === 200) { - message.success(`Update ${str.toLocaleLowerCase()} successfully`); - this.getUpdateExample(); - } else { - message.error(`Update ${str.toLocaleLowerCase()} failed`); - } - }); - } - - updateTrialMess = () => { - const { trialMess } = this.state; - if (trialMess !== '' || trialMess !== null) { - this.updateTrialNumLoad(); - const { experiment } = this.state; - const newExperiment = JSON.parse(JSON.stringify(experiment)); - const trialObj = JSON.parse(trialMess); - const orimaxDuration = experiment.params.maxExecDuration; - const oriconTrial = experiment.params.trialConcurrency; - const flagMax = (trialObj.maxExecDuration !== orimaxDuration); - const flagCon = (trialObj.trialConcurrency !== oriconTrial); - if (flagCon && flagMax) { - newExperiment.params.trialConcurrency = trialObj.trialConcurrency; - newExperiment.params.maxExecDuration = trialObj.maxExecDuration; - this.trialParameterMess(newExperiment, CONTROLTYPE[1]); - this.trialParameterMess(newExperiment, CONTROLTYPE[2]); - } else if (flagCon) { - newExperiment.params.trialConcurrency = trialObj.trialConcurrency; - this.trialParameterMess(newExperiment, CONTROLTYPE[1]); - } else if (flagMax) { - newExperiment.params.maxExecDuration = trialObj.maxExecDuration; - this.trialParameterMess(newExperiment, CONTROLTYPE[2]); - } else { - message.info('you have not modified this file'); - } - this.updateTrialNumNormal(); - } else { - message.error('The text can not be empty'); - } - } - - userSubmitJob = () => { - const { addTrial } = this.state; - if (addTrial === null || addTrial === '') { - message.error('The text can not be empty'); - } else { - this.addButtonLoad(); - // new experiment obj - axios(`${MANAGER_IP}/trial-jobs`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - data: addTrial - }).then(res => { - if (res.status === 200) { - message.success('Submit successfully'); - } else { - message.error('Submit failed'); - } - this.addButtonNormal(); - }); - } - - } - - userUpdateSeaspace = () => { - - this.updateSearchLoad(); - const { updateSearch } = this.state; - if (updateSearch !== '' || updateSearch !== null) { - const { experiment } = this.state; - const newExperiment = JSON.parse(JSON.stringify(experiment)); - newExperiment.params.searchSpace = updateSearch; - this.trialParameterMess(newExperiment, CONTROLTYPE[0]); - this.updateSearchNormal(); - } else { - message.error('The text can not be empty'); - } - } - - componentDidMount() { - - this._isMounted = true; - this.getAddExample(); - this.getUpdateExample(); - } - - componentWillUnmount() { - - this._isMounted = false; - } - - render() { - const { addTrial, addisabled, updateSearch, updisabled, - trialMess, upTrialdis - } = this.state; - return ( -
-
-
-
- | - Experiment parameters -
-
-