"docs/git@developer.sourcefind.cn:OpenDAS/nni.git" did not exist on "463c0f78d74c7f3d8f9053602868ae5b208475ff"
Commit 13bec759 authored by Lijiao's avatar Lijiao Committed by Guoxin
Browse files

fix bugs, sort, concurrency, multi (#1451)

fix bugs about sort & concurrency & multi-phase 
parent d754574c
import * as React from 'react'; import * as React from 'react';
import { Row, Col } from 'antd'; import { Row, Col } from 'antd';
import axios from 'axios';
import { COLUMN, MANAGER_IP } from './static/const';
import './App.css'; import './App.css';
import SlideBar from './components/SlideBar'; import SlideBar from './components/SlideBar';
interface AppState { interface AppState {
interval: number; interval: number;
whichPageToFresh: string; whichPageToFresh: string;
columnList: Array<string>;
concurrency: number;
} }
class App extends React.Component<{}, AppState> { class App extends React.Component<{}, AppState> {
...@@ -14,7 +18,9 @@ class App extends React.Component<{}, AppState> { ...@@ -14,7 +18,9 @@ class App extends React.Component<{}, AppState> {
super(props); super(props);
this.state = { this.state = {
interval: 10, // sendons interval: 10, // sendons
whichPageToFresh: '' whichPageToFresh: '',
columnList: COLUMN,
concurrency: 1
}; };
} }
...@@ -31,25 +37,57 @@ class App extends React.Component<{}, AppState> { ...@@ -31,25 +37,57 @@ class App extends React.Component<{}, AppState> {
} }
} }
changeColumn = (columnList: Array<string>) => {
if (this._isMounted === true) {
this.setState(() => ({ columnList: columnList }));
}
}
changeConcurrency = (val: number) => {
if (this._isMounted === true) {
this.setState(() => ({ concurrency: val }));
}
}
getConcurrency = () => {
axios(`${MANAGER_IP}/experiment`, {
method: 'GET'
})
.then(res => {
if (res.status === 200) {
const params = res.data.params;
if (this._isMounted) {
this.setState(() => ({ concurrency: params.trialConcurrency }));
}
}
});
}
componentDidMount() { componentDidMount() {
this._isMounted = true; this._isMounted = true;
this.getConcurrency();
} }
componentWillUnmount() { componentWillUnmount() {
this._isMounted = false; this._isMounted = false;
} }
render() { render() {
const { interval, whichPageToFresh } = this.state; const { interval, whichPageToFresh, columnList, concurrency } = this.state;
const reactPropsChildren = React.Children.map(this.props.children, child => const reactPropsChildren = React.Children.map(this.props.children, child =>
// tslint:disable-next-line:no-any React.cloneElement(
React.cloneElement(child as React.ReactElement<any>, { interval, whichPageToFresh }) // tslint:disable-next-line:no-any
child as React.ReactElement<any>, {
interval, whichPageToFresh,
columnList, changeColumn: this.changeColumn,
concurrency, changeConcurrency: this.changeConcurrency
})
); );
return ( return (
<Row className="nni" style={{ minHeight: window.innerHeight }}> <Row className="nni" style={{ minHeight: window.innerHeight }}>
<Row className="header"> <Row className="header">
<Col span={1} /> <Col span={1} />
<Col className="headerCon" span={22}> <Col className="headerCon" span={22}>
<SlideBar changeInterval={this.changeInterval} changeFresh={this.changeFresh}/> <SlideBar changeInterval={this.changeInterval} changeFresh={this.changeFresh} />
</Col> </Col>
<Col span={1} /> <Col span={1} />
</Row> </Row>
......
...@@ -42,8 +42,7 @@ class ExperimentDrawer extends React.Component<ExpDrawerProps, ExpDrawerState> { ...@@ -42,8 +42,7 @@ class ExperimentDrawer extends React.Component<ExpDrawerProps, ExpDrawerState> {
let trialMessagesArr = res1.data; let trialMessagesArr = res1.data;
const interResultList = res2.data; const interResultList = res2.data;
Object.keys(trialMessagesArr).map(item => { Object.keys(trialMessagesArr).map(item => {
// transform hyperparameters as object to show elegantly // not deal with trial's hyperParameters
trialMessagesArr[item].hyperParameters = JSON.parse(trialMessagesArr[item].hyperParameters);
const trialId = trialMessagesArr[item].id; const trialId = trialMessagesArr[item].id;
// add intermediate result message // add intermediate result message
trialMessagesArr[item].intermediate = []; trialMessagesArr[item].intermediate = [];
......
...@@ -42,6 +42,8 @@ interface OverviewState { ...@@ -42,6 +42,8 @@ interface OverviewState {
interface OverviewProps { interface OverviewProps {
interval: number; // user select interval: number; // user select
whichPageToFresh: string; whichPageToFresh: string;
concurrency: number;
changeConcurrency: (val: number) => void;
} }
class Overview extends React.Component<OverviewProps, OverviewState> { class Overview extends React.Component<OverviewProps, OverviewState> {
...@@ -61,7 +63,7 @@ class Overview extends React.Component<OverviewProps, OverviewState> { ...@@ -61,7 +63,7 @@ class Overview extends React.Component<OverviewProps, OverviewState> {
id: '', id: '',
author: '', author: '',
experName: '', experName: '',
runConcurren: 0, runConcurren: 1,
maxDuration: 0, maxDuration: 0,
execDuration: 0, execDuration: 0,
MaxTrialNum: 0, MaxTrialNum: 0,
...@@ -264,7 +266,8 @@ class Overview extends React.Component<OverviewProps, OverviewState> { ...@@ -264,7 +266,8 @@ class Overview extends React.Component<OverviewProps, OverviewState> {
profile.succTrial += 1; profile.succTrial += 1;
const desJobDetail: Parameters = { const desJobDetail: Parameters = {
parameters: {}, parameters: {},
intermediate: [] intermediate: [],
multiProgress: 1
}; };
const duration = (tableData[item].endTime - tableData[item].startTime) / 1000; const duration = (tableData[item].endTime - tableData[item].startTime) / 1000;
const acc = getFinal(tableData[item].finalMetricData); const acc = getFinal(tableData[item].finalMetricData);
...@@ -273,6 +276,7 @@ class Overview extends React.Component<OverviewProps, OverviewState> { ...@@ -273,6 +276,7 @@ class Overview extends React.Component<OverviewProps, OverviewState> {
if (tempara !== undefined) { if (tempara !== undefined) {
const tempLength = tempara.length; const tempLength = tempara.length;
const parameters = JSON.parse(tempara[tempLength - 1]).parameters; const parameters = JSON.parse(tempara[tempLength - 1]).parameters;
desJobDetail.multiProgress = tempara.length;
if (typeof parameters === 'string') { if (typeof parameters === 'string') {
desJobDetail.parameters = JSON.parse(parameters); desJobDetail.parameters = JSON.parse(parameters);
} else { } else {
...@@ -462,6 +466,18 @@ class Overview extends React.Component<OverviewProps, OverviewState> { ...@@ -462,6 +466,18 @@ class Overview extends React.Component<OverviewProps, OverviewState> {
accNodata, status, errorStr, trialNumber, bestAccuracy, isMultiPhase, accNodata, status, errorStr, trialNumber, bestAccuracy, isMultiPhase,
titleMaxbgcolor, titleMinbgcolor, isLogCollection, experimentAPI titleMaxbgcolor, titleMinbgcolor, isLogCollection, experimentAPI
} = this.state; } = this.state;
const { concurrency } = this.props;
trialProfile.runConcurren = concurrency;
Object.keys(experimentAPI).map(item => {
if (item === 'params') {
const temp = experimentAPI[item];
Object.keys(temp).map(index => {
if (index === 'trialConcurrency') {
temp[index] = concurrency;
}
});
}
});
return ( return (
<div className="overview"> <div className="overview">
...@@ -480,7 +496,8 @@ class Overview extends React.Component<OverviewProps, OverviewState> { ...@@ -480,7 +496,8 @@ class Overview extends React.Component<OverviewProps, OverviewState> {
bestAccuracy={bestAccuracy} bestAccuracy={bestAccuracy}
status={status} status={status}
errors={errorStr} errors={errorStr}
updateFile={this.showSessionPro} concurrency={concurrency}
changeConcurrency={this.props.changeConcurrency}
/> />
</Col> </Col>
{/* experiment parameters search space tuner assessor... */} {/* experiment parameters search space tuner assessor... */}
......
...@@ -136,7 +136,7 @@ class SlideBar extends React.Component<SliderProps, SliderState> { ...@@ -136,7 +136,7 @@ class SlideBar extends React.Component<SliderProps, SliderState> {
onChange={this.handleVisibleChange} onChange={this.handleVisibleChange}
title={ title={
<span> <span>
<span>Download</span> <span>View</span>
</span> </span>
} }
> >
...@@ -234,7 +234,7 @@ class SlideBar extends React.Component<SliderProps, SliderState> { ...@@ -234,7 +234,7 @@ class SlideBar extends React.Component<SliderProps, SliderState> {
> >
<a className="ant-dropdown-link" href="#"> <a className="ant-dropdown-link" href="#">
<Icon type="download" className="down-icon" /> <Icon type="download" className="down-icon" />
<span>Download</span> <span>View</span>
{ {
menuVisible menuVisible
? ?
......
...@@ -38,6 +38,8 @@ interface TrialDetailState { ...@@ -38,6 +38,8 @@ interface TrialDetailState {
interface TrialsDetailProps { interface TrialsDetailProps {
interval: number; interval: number;
whichPageToFresh: string; whichPageToFresh: string;
columnList: Array<string>;
changeColumn: (val: Array<string>) => void;
} }
class TrialsDetail extends React.Component<TrialsDetailProps, TrialDetailState> { class TrialsDetail extends React.Component<TrialsDetailProps, TrialDetailState> {
...@@ -112,7 +114,7 @@ class TrialsDetail extends React.Component<TrialsDetailProps, TrialDetailState> ...@@ -112,7 +114,7 @@ class TrialsDetail extends React.Component<TrialsDetailProps, TrialDetailState>
let desc: Parameters = { let desc: Parameters = {
parameters: {}, parameters: {},
intermediate: [], intermediate: [],
progress: 1 multiProgress: 1
}; };
let duration = 0; let duration = 0;
const id = trialJobs[item].id !== undefined const id = trialJobs[item].id !== undefined
...@@ -133,7 +135,7 @@ class TrialsDetail extends React.Component<TrialsDetailProps, TrialDetailState> ...@@ -133,7 +135,7 @@ class TrialsDetail extends React.Component<TrialsDetailProps, TrialDetailState>
const tempHyper = trialJobs[item].hyperParameters; const tempHyper = trialJobs[item].hyperParameters;
if (tempHyper !== undefined) { if (tempHyper !== undefined) {
const getPara = JSON.parse(tempHyper[tempHyper.length - 1]).parameters; const getPara = JSON.parse(tempHyper[tempHyper.length - 1]).parameters;
desc.progress = tempHyper.length; desc.multiProgress = tempHyper.length;
if (typeof getPara === 'string') { if (typeof getPara === 'string') {
desc.parameters = JSON.parse(getPara); desc.parameters = JSON.parse(getPara);
} else { } else {
...@@ -397,6 +399,7 @@ class TrialsDetail extends React.Component<TrialsDetailProps, TrialDetailState> ...@@ -397,6 +399,7 @@ class TrialsDetail extends React.Component<TrialsDetailProps, TrialDetailState>
whichGraph, searchPlaceHolder whichGraph, searchPlaceHolder
} = this.state; } = this.state;
const source = isHasSearch ? searchResultSource : tableListSource; const source = isHasSearch ? searchResultSource : tableListSource;
const { columnList, changeColumn } = this.props;
return ( return (
<div> <div>
<div className="trial" id="tabsty"> <div className="trial" id="tabsty">
...@@ -482,6 +485,8 @@ class TrialsDetail extends React.Component<TrialsDetailProps, TrialDetailState> ...@@ -482,6 +485,8 @@ class TrialsDetail extends React.Component<TrialsDetailProps, TrialDetailState>
platform={experimentInfo.platform} platform={experimentInfo.platform}
updateList={this.getDetailSource} updateList={this.getDetailSource}
logCollection={experimentLogCollection} logCollection={experimentLogCollection}
columnList={columnList}
changeColumn={changeColumn}
ref={(tabList) => this.tableList = tabList} ref={(tabList) => this.tableList = tabList}
/> />
</div> </div>
......
...@@ -11,11 +11,12 @@ import '../../static/style/probar.scss'; ...@@ -11,11 +11,12 @@ import '../../static/style/probar.scss';
interface ProgressProps { interface ProgressProps {
trialProfile: Experiment; trialProfile: Experiment;
concurrency: number;
trialNumber: TrialNumber; trialNumber: TrialNumber;
bestAccuracy: number; bestAccuracy: number;
status: string; status: string;
errors: string; errors: string;
updateFile: Function; changeConcurrency: (val: number) => void;
} }
interface ProgressState { interface ProgressState {
...@@ -45,12 +46,14 @@ class Progressed extends React.Component<ProgressProps, ProgressState> { ...@@ -45,12 +46,14 @@ class Progressed extends React.Component<ProgressProps, ProgressState> {
const { btnName } = this.state; const { btnName } = this.state;
if (this._isMounted) { if (this._isMounted) {
if (btnName === 'Edit') { if (btnName === 'Edit') {
// user click edit
this.setState(() => ({ this.setState(() => ({
isEnable: false, isEnable: false,
btnName: 'Save', btnName: 'Save',
cancelSty: 'inline-block' cancelSty: 'inline-block'
})); }));
} else { } else {
// user click save button
axios(`${MANAGER_IP}/experiment`, { axios(`${MANAGER_IP}/experiment`, {
method: 'GET' method: 'GET'
}) })
...@@ -81,9 +84,7 @@ class Progressed extends React.Component<ProgressProps, ProgressState> { ...@@ -81,9 +84,7 @@ class Progressed extends React.Component<ProgressProps, ProgressState> {
message.destroy(); message.destroy();
message.success(`Update ${CONTROLTYPE[1].toLocaleLowerCase()} message.success(`Update ${CONTROLTYPE[1].toLocaleLowerCase()}
successfully`); successfully`);
// rerender trial profile message this.props.changeConcurrency(parseInt(userInputVal, 10));
const { updateFile } = this.props;
updateFile();
} }
}) })
.catch(error => { .catch(error => {
......
...@@ -98,7 +98,7 @@ class OpenRow extends React.Component<OpenRowProps, OpenRowState> { ...@@ -98,7 +98,7 @@ class OpenRow extends React.Component<OpenRowProps, OpenRowState> {
For the entire parameter set, please refer to the following " For the entire parameter set, please refer to the following "
<a href={trialink} target="_blank">{trialink}</a>". <a href={trialink} target="_blank">{trialink}</a>".
<br/> <br/>
Current Phase: {record.description.progress}. Current Phase: {record.description.multiProgress}.
</Row> </Row>
: :
<div /> <div />
......
...@@ -275,7 +275,7 @@ class DefaultPoint extends React.Component<DefaultPointProps, DefaultPointState> ...@@ -275,7 +275,7 @@ class DefaultPoint extends React.Component<DefaultPointProps, DefaultPointState>
<div> <div>
<div className="default-metric"> <div className="default-metric">
<div className="position"> <div className="position">
<span className="bold">optimization curve</span> <span className="bold">Optimization curve</span>
<Switch defaultChecked={false} onChange={this.loadDefault} /> <Switch defaultChecked={false} onChange={this.loadDefault} />
</div> </div>
</div> </div>
......
...@@ -4,7 +4,7 @@ import ReactEcharts from 'echarts-for-react'; ...@@ -4,7 +4,7 @@ import ReactEcharts from 'echarts-for-react';
import { Row, Table, Button, Popconfirm, Modal, Checkbox, Select, Icon } from 'antd'; import { Row, Table, Button, Popconfirm, Modal, Checkbox, Select, Icon } from 'antd';
const Option = Select.Option; const Option = Select.Option;
const CheckboxGroup = Checkbox.Group; const CheckboxGroup = Checkbox.Group;
import { MANAGER_IP, trialJobStatus, COLUMN, COLUMN_INDEX, COLUMNPro } from '../../static/const'; import { MANAGER_IP, trialJobStatus, COLUMN_INDEX, COLUMNPro } from '../../static/const';
import { convertDuration, intermediateGraphOption, killJob, filterByStatus } from '../../static/function'; import { convertDuration, intermediateGraphOption, killJob, filterByStatus } from '../../static/function';
import { TableObj, TrialJob } from '../../static/interface'; import { TableObj, TrialJob } from '../../static/interface';
import OpenRow from '../public-child/OpenRow'; import OpenRow from '../public-child/OpenRow';
...@@ -32,6 +32,8 @@ interface TableListProps { ...@@ -32,6 +32,8 @@ interface TableListProps {
platform: string; platform: string;
logCollection: boolean; logCollection: boolean;
isMultiPhase: boolean; isMultiPhase: boolean;
columnList: Array<string>; // user select columnKeys
changeColumn: (val: Array<string>) => void;
} }
interface TableListState { interface TableListState {
...@@ -39,7 +41,6 @@ interface TableListState { ...@@ -39,7 +41,6 @@ interface TableListState {
modalVisible: boolean; modalVisible: boolean;
isObjFinal: boolean; isObjFinal: boolean;
isShowColumn: boolean; isShowColumn: boolean;
columnSelected: Array<string>; // user select columnKeys
selectRows: Array<TableObj>; selectRows: Array<TableObj>;
isShowCompareModal: boolean; isShowCompareModal: boolean;
selectedRowKeys: string[] | number[]; selectedRowKeys: string[] | number[];
...@@ -69,7 +70,6 @@ class TableList extends React.Component<TableListProps, TableListState> { ...@@ -69,7 +70,6 @@ class TableList extends React.Component<TableListProps, TableListState> {
isObjFinal: false, isObjFinal: false,
isShowColumn: false, isShowColumn: false,
isShowCompareModal: false, isShowCompareModal: false,
columnSelected: COLUMN,
selectRows: [], selectRows: [],
selectedRowKeys: [], // close selected trial message after modal closed selectedRowKeys: [], // close selected trial message after modal closed
intermediateData: [], intermediateData: [],
...@@ -120,6 +120,8 @@ class TableList extends React.Component<TableListProps, TableListState> { ...@@ -120,6 +120,8 @@ class TableList extends React.Component<TableListProps, TableListState> {
} }
} }
// intermediate button click -> intermediate graph for each trial
// support intermediate is dict
selectOtherKeys = (value: string) => { selectOtherKeys = (value: string) => {
const isShowDefault: boolean = value === 'default' ? true : false; const isShowDefault: boolean = value === 'default' ? true : false;
...@@ -226,7 +228,7 @@ class TableList extends React.Component<TableListProps, TableListState> { ...@@ -226,7 +228,7 @@ class TableList extends React.Component<TableListProps, TableListState> {
}); });
if (this._isMounted) { if (this._isMounted) {
this.setState(() => ({ columnSelected: wantResult })); this.props.changeColumn(wantResult);
} }
} }
...@@ -277,8 +279,8 @@ class TableList extends React.Component<TableListProps, TableListState> { ...@@ -277,8 +279,8 @@ class TableList extends React.Component<TableListProps, TableListState> {
render() { render() {
const { entries, tableSource, updateList } = this.props; const { entries, tableSource, updateList, columnList } = this.props;
const { intermediateOption, modalVisible, isShowColumn, columnSelected, const { intermediateOption, modalVisible, isShowColumn,
selectRows, isShowCompareModal, selectedRowKeys, intermediateOtherKeys } = this.state; selectRows, isShowCompareModal, selectedRowKeys, intermediateOtherKeys } = this.state;
const rowSelection = { const rowSelection = {
selectedRowKeys: selectedRowKeys, selectedRowKeys: selectedRowKeys,
...@@ -316,8 +318,8 @@ class TableList extends React.Component<TableListProps, TableListState> { ...@@ -316,8 +318,8 @@ class TableList extends React.Component<TableListProps, TableListState> {
value: item value: item
}); });
}); });
Object.keys(columnSelected).map(key => { Object.keys(columnList).map(key => {
const item = columnSelected[key]; const item = columnList[key];
switch (item) { switch (item) {
case 'Trial No.': case 'Trial No.':
showColumn.push({ showColumn.push({
...@@ -413,13 +415,12 @@ class TableList extends React.Component<TableListProps, TableListState> { ...@@ -413,13 +415,12 @@ class TableList extends React.Component<TableListProps, TableListState> {
key: 'acc', key: 'acc',
width: 120, width: 120,
sorter: (a: TableObj, b: TableObj) => { sorter: (a: TableObj, b: TableObj) => {
const aa = a.description.intermediate; const oneArr = a.description.intermediate;
const bb = b.description.intermediate; const otherArr = b.description.intermediate;
if (aa !== undefined && bb !== undefined) { const one = (oneArr[oneArr.length - 1] !== undefined) ? oneArr[oneArr.length - 1] : 0;
return aa[aa.length - 1] - bb[bb.length - 1]; const other = (otherArr[otherArr.length - 1] !== undefined)
} else { ? otherArr[otherArr.length - 1] : 0;
return NaN; return one - other;
}
}, },
render: (text: string, record: TableObj) => { render: (text: string, record: TableObj) => {
return ( return (
...@@ -581,7 +582,8 @@ class TableList extends React.Component<TableListProps, TableListState> { ...@@ -581,7 +582,8 @@ class TableList extends React.Component<TableListProps, TableListState> {
> >
<CheckboxGroup <CheckboxGroup
options={showTitle} options={showTitle}
defaultValue={columnSelected} defaultValue={columnList}
// defaultValue={columnSelected}
onChange={this.selectedColumn} onChange={this.selectedColumn}
className="titleColumn" className="titleColumn"
/> />
......
...@@ -27,7 +27,7 @@ interface Parameters { ...@@ -27,7 +27,7 @@ interface Parameters {
parameters: ErrorParameter; parameters: ErrorParameter;
logPath?: string; logPath?: string;
intermediate: Array<number>; intermediate: Array<number>;
progress?: number; multiProgress?: number;
} }
interface Experiment { interface Experiment {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment