Unverified Commit e2d8cc1b authored by Lijiaoa's avatar Lijiaoa Committed by GitHub
Browse files

[webui] format code by eslint and prettier (#2744)



* update

* format as prettier

* fix error

* add stylelint for scss css file

* add arrow-parens rule

* update

* fix lint

* fix conflict
Co-authored-by: default avatarLijiao <15910218274@163.com>
Co-authored-by: default avatarLijiao <Lijiaoa@outlook.com>
Co-authored-by: default avatarLijiao <1425861283@qq.com>
parent 4668fc08
...@@ -23,16 +23,13 @@ interface DurationState { ...@@ -23,16 +23,13 @@ interface DurationState {
} }
class Duration extends React.Component<DurationProps, DurationState> { class Duration extends React.Component<DurationProps, DurationState> {
constructor(props: DurationProps) { constructor(props: DurationProps) {
super(props); super(props);
this.state = { this.state = {
startDuration: 0, // for record data zoom startDuration: 0, // for record data zoom
endDuration: 100, endDuration: 100,
durationSource: this.initDuration(this.props.source), durationSource: this.initDuration(this.props.source)
}; };
} }
initDuration = (source: Array<TableObj>): any => { initDuration = (source: Array<TableObj>): any => {
...@@ -50,12 +47,15 @@ class Duration extends React.Component<DurationProps, DurationState> { ...@@ -50,12 +47,15 @@ class Duration extends React.Component<DurationProps, DurationState> {
axisPointer: { axisPointer: {
type: 'shadow' type: 'shadow'
}, },
formatter: (data: any): React.ReactNode => ( formatter: (data: any): React.ReactNode =>
'<div>' + '<div>' +
'<div>Trial No.: ' + data[0].dataIndex + '</div>' + '<div>Trial No.: ' +
'<div>Duration: ' + convertDuration(data[0].data) + '</div>' + data[0].dataIndex +
'</div>' +
'<div>Duration: ' +
convertDuration(data[0].data) +
'</div>' +
'</div>' '</div>'
),
}, },
grid: { grid: {
bottom: '3%', bottom: '3%',
...@@ -71,11 +71,11 @@ class Duration extends React.Component<DurationProps, DurationState> { ...@@ -71,11 +71,11 @@ class Duration extends React.Component<DurationProps, DurationState> {
filterMode: 'empty', filterMode: 'empty',
start: 0, start: 0,
end: 100 end: 100
}, }
], ],
xAxis: { xAxis: {
name: 'Time/s', name: 'Time/s',
type: 'value', type: 'value'
}, },
yAxis: { yAxis: {
name: 'Trial No.', name: 'Trial No.',
...@@ -85,12 +85,14 @@ class Duration extends React.Component<DurationProps, DurationState> { ...@@ -85,12 +85,14 @@ class Duration extends React.Component<DurationProps, DurationState> {
padding: [0, 0, 0, 30] padding: [0, 0, 0, 30]
} }
}, },
series: [{ series: [
type: 'bar', {
data: trialTime type: 'bar',
}] data: trialTime
}
]
}; };
} };
getOption = (dataObj: Runtrial): any => { getOption = (dataObj: Runtrial): any => {
const { startDuration, endDuration } = this.state; const { startDuration, endDuration } = this.state;
...@@ -100,12 +102,15 @@ class Duration extends React.Component<DurationProps, DurationState> { ...@@ -100,12 +102,15 @@ class Duration extends React.Component<DurationProps, DurationState> {
axisPointer: { axisPointer: {
type: 'shadow' type: 'shadow'
}, },
formatter: (data: any): React.ReactNode => ( formatter: (data: any): React.ReactNode =>
'<div>' + '<div>' +
'<div>Trial No.: ' + data[0].dataIndex + '</div>' + '<div>Trial No.: ' +
'<div>Duration: ' + convertDuration(data[0].data) + '</div>' + data[0].dataIndex +
'</div>' +
'<div>Duration: ' +
convertDuration(data[0].data) +
'</div>' +
'</div>' '</div>'
),
}, },
grid: { grid: {
bottom: '3%', bottom: '3%',
...@@ -121,11 +126,11 @@ class Duration extends React.Component<DurationProps, DurationState> { ...@@ -121,11 +126,11 @@ class Duration extends React.Component<DurationProps, DurationState> {
filterMode: 'empty', filterMode: 'empty',
start: startDuration, start: startDuration,
end: endDuration end: endDuration
}, }
], ],
xAxis: { xAxis: {
name: 'Time', name: 'Time',
type: 'value', type: 'value'
}, },
yAxis: { yAxis: {
name: 'Trial', name: 'Trial',
...@@ -135,12 +140,14 @@ class Duration extends React.Component<DurationProps, DurationState> { ...@@ -135,12 +140,14 @@ class Duration extends React.Component<DurationProps, DurationState> {
padding: [0, 0, 0, 30] padding: [0, 0, 0, 30]
} }
}, },
series: [{ series: [
type: 'bar', {
data: dataObj.trialTime type: 'bar',
}] data: dataObj.trialTime
}
]
}; };
} };
drawDurationGraph = (source: Array<TableObj>): void => { drawDurationGraph = (source: Array<TableObj>): void => {
// why this function run two times when props changed? // why this function run two times when props changed?
...@@ -160,7 +167,7 @@ class Duration extends React.Component<DurationProps, DurationState> { ...@@ -160,7 +167,7 @@ class Duration extends React.Component<DurationProps, DurationState> {
this.setState({ this.setState({
durationSource: this.getOption(trialRun[0]) durationSource: this.getOption(trialRun[0])
}); });
} };
componentDidMount(): void { componentDidMount(): void {
const { source } = this.props; const { source } = this.props;
...@@ -178,13 +185,13 @@ class Duration extends React.Component<DurationProps, DurationState> { ...@@ -178,13 +185,13 @@ class Duration extends React.Component<DurationProps, DurationState> {
render(): React.ReactNode { render(): React.ReactNode {
const { durationSource } = this.state; const { durationSource } = this.state;
const onEvents = { 'dataZoom': this.durationDataZoom }; const onEvents = { dataZoom: this.durationDataZoom };
return ( return (
<div> <div>
<ReactEcharts <ReactEcharts
option={durationSource} option={durationSource}
style={{ width: '94%', height: 412, margin: '0 auto', marginTop: 15 }} style={{ width: '94%', height: 412, margin: '0 auto', marginTop: 15 }}
theme="my_theme" theme='my_theme'
notMerge={true} // update now notMerge={true} // update now
onEvents={onEvents} onEvents={onEvents}
/> />
...@@ -195,11 +202,11 @@ class Duration extends React.Component<DurationProps, DurationState> { ...@@ -195,11 +202,11 @@ class Duration extends React.Component<DurationProps, DurationState> {
private durationDataZoom = (e: EventMap): void => { private durationDataZoom = (e: EventMap): void => {
if (e.batch !== undefined) { if (e.batch !== undefined) {
this.setState(() => ({ this.setState(() => ({
startDuration: (e.batch[0].start !== null ? e.batch[0].start : 0), startDuration: e.batch[0].start !== null ? e.batch[0].start : 0,
endDuration: (e.batch[0].end !== null ? e.batch[0].end : 100) endDuration: e.batch[0].end !== null ? e.batch[0].end : 100
})); }));
} }
} };
} }
export default Duration; export default Duration;
...@@ -28,7 +28,6 @@ interface IntermediateProps { ...@@ -28,7 +28,6 @@ interface IntermediateProps {
} }
class Intermediate extends React.Component<IntermediateProps, IntermediateState> { class Intermediate extends React.Component<IntermediateProps, IntermediateState> {
static intervalMediate = 1; static intervalMediate = 1;
public pointInput!: HTMLInputElement | null; public pointInput!: HTMLInputElement | null;
public minValInput!: HTMLInputElement | null; public minValInput!: HTMLInputElement | null;
...@@ -68,7 +67,9 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState> ...@@ -68,7 +67,9 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState>
}); });
}); });
// find max intermediate number // find max intermediate number
trialIntermediate.sort((a, b) => { return (b.data.length - a.data.length); }); trialIntermediate.sort((a, b) => {
return b.data.length - a.data.length;
});
const legend: string[] = []; const legend: string[] = [];
// max length // max length
const length = trialIntermediate[0].data.length; const length = trialIntermediate[0].data.length;
...@@ -84,27 +85,35 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState> ...@@ -84,27 +85,35 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState>
tooltip: { tooltip: {
trigger: 'item', trigger: 'item',
enterable: true, enterable: true,
position: function (point: number[], data: TooltipForIntermediate): number[] { position: function(point: number[], data: TooltipForIntermediate): number[] {
if (data.dataIndex < length / 2) { if (data.dataIndex < length / 2) {
return [point[0], 80]; return [point[0], 80];
} else { } else {
return [point[0] - 300, 80]; return [point[0] - 300, 80];
} }
}, },
formatter: function (data: TooltipForIntermediate): React.ReactNode { formatter: function(data: TooltipForIntermediate): React.ReactNode {
const trialId = data.seriesName; const trialId = data.seriesName;
let obj = {}; let obj = {};
const temp = trialIntermediate.find(key => key.name === trialId); const temp = trialIntermediate.find(key => key.name === trialId);
if (temp !== undefined) { if (temp !== undefined) {
obj = temp.hyperPara; obj = temp.hyperPara;
} }
return '<div class="tooldetailAccuracy">' + return (
'<div>Trial ID: ' + trialId + '</div>' + '<div class="tooldetailAccuracy">' +
'<div>Intermediate: ' + data.data + '</div>' + '<div>Trial ID: ' +
trialId +
'</div>' +
'<div>Intermediate: ' +
data.data +
'</div>' +
'<div>Parameters: ' + '<div>Parameters: ' +
'<pre>' + JSON.stringify(obj, null, 4) + '</pre>' + '<pre>' +
JSON.stringify(obj, null, 4) +
'</pre>' +
'</div>' + '</div>' +
'</div>'; '</div>'
);
} }
}, },
grid: { grid: {
...@@ -121,7 +130,7 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState> ...@@ -121,7 +130,7 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState>
yAxis: { yAxis: {
type: 'value', type: 'value',
name: 'Metric', name: 'Metric',
scale: true, scale: true
}, },
dataZoom: [ dataZoom: [
{ {
...@@ -147,7 +156,7 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState> ...@@ -147,7 +156,7 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState>
}, },
xAxis: { xAxis: {
type: 'category', type: 'category',
boundaryGap: false, boundaryGap: false
}, },
yAxis: { yAxis: {
type: 'value', type: 'value',
...@@ -156,7 +165,7 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState> ...@@ -156,7 +165,7 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState>
}; };
this.setState({ interSource: nullData }); this.setState({ interSource: nullData });
} }
} };
// confirm btn function [filter data] // confirm btn function [filter data]
filterLines = (): void => { filterLines = (): void => {
...@@ -198,14 +207,14 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState> ...@@ -198,14 +207,14 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState>
const counts = this.state.clickCounts + 1; const counts = this.state.clickCounts + 1;
this.setState({ isLoadconfirmBtn: false, clickCounts: counts }); this.setState({ isLoadconfirmBtn: false, clickCounts: counts });
}); });
} };
switchTurn = (ev: React.MouseEvent<HTMLElement>, checked?: boolean): void => { switchTurn = (ev: React.MouseEvent<HTMLElement>, checked?: boolean): void => {
this.setState({ isFilter: checked }); this.setState({ isFilter: checked });
if (checked === false) { if (checked === false) {
this.drawIntermediate(this.props.source); this.drawIntermediate(this.props.source);
} }
} };
componentDidMount(): void { componentDidMount(): void {
const { source } = this.props; const { source } = this.props;
...@@ -235,56 +244,47 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState> ...@@ -235,56 +244,47 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState>
render(): React.ReactNode { render(): React.ReactNode {
const { interSource, isLoadconfirmBtn, isFilter } = this.state; const { interSource, isLoadconfirmBtn, isFilter } = this.state;
const IntermediateEvents = { 'dataZoom': this.intermediateDataZoom }; const IntermediateEvents = { dataZoom: this.intermediateDataZoom };
return ( return (
<div> <div>
{/* style in para.scss */} {/* style in para.scss */}
<Stack horizontal horizontalAlign="end" tokens={stackTokens} className="meline intermediate"> <Stack horizontal horizontalAlign='end' tokens={stackTokens} className='meline intermediate'>
{ {isFilter ? (
isFilter <div>
? <span className='filter-x'># Intermediate result</span>
<div> <input
<span className="filter-x"># Intermediate result</span> // placeholder="point"
<input ref={(input): any => (this.pointInput = input)}
// placeholder="point" className='strange'
ref={(input): any => this.pointInput = input} />
className="strange" <span>Metric range</span>
/> <input
<span>Metric range</span> // placeholder="range"
<input ref={(input): any => (this.minValInput = input)}
// placeholder="range" />
ref={(input): any => this.minValInput = input} <span className='hyphen'>-</span>
/> <input
<span className="hyphen">-</span> // placeholder="range"
<input ref={(input): any => (this.maxValInput = input)}
// placeholder="range" />
ref={(input): any => this.maxValInput = input} <PrimaryButton text='Confirm' onClick={this.filterLines} disabled={isLoadconfirmBtn} />
/> </div>
<PrimaryButton ) : null}
text="Confirm"
onClick={this.filterLines}
disabled={isLoadconfirmBtn}
/>
</div>
:
null
}
{/* filter message */} {/* filter message */}
<Stack horizontal className="filter-toggle"> <Stack horizontal className='filter-toggle'>
<span>Filter</span> <span>Filter</span>
<Toggle onChange={this.switchTurn} /> <Toggle onChange={this.switchTurn} />
</Stack> </Stack>
</Stack> </Stack>
<div className="intermediate-graph"> <div className='intermediate-graph'>
<ReactEcharts <ReactEcharts
option={interSource} option={interSource}
style={{ width: '100%', height: 400, margin: '0 auto' }} style={{ width: '100%', height: 400, margin: '0 auto' }}
notMerge={true} // update now notMerge={true} // update now
onEvents={IntermediateEvents} onEvents={IntermediateEvents}
/> />
<div className="xAxis"># Intermediate result</div> <div className='xAxis'># Intermediate result</div>
</div> </div>
</div> </div>
); );
...@@ -293,11 +293,11 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState> ...@@ -293,11 +293,11 @@ class Intermediate extends React.Component<IntermediateProps, IntermediateState>
private intermediateDataZoom = (e: EventMap): void => { private intermediateDataZoom = (e: EventMap): void => {
if (e.batch !== undefined) { if (e.batch !== undefined) {
this.setState(() => ({ this.setState(() => ({
startMediaY: (e.batch[0].start !== null ? e.batch[0].start : 0), startMediaY: e.batch[0].start !== null ? e.batch[0].start : 0,
endMediaY: (e.batch[0].end !== null ? e.batch[0].end : 100) endMediaY: e.batch[0].end !== null ? e.batch[0].end : 100
})); }));
} }
} };
} }
export default Intermediate; export default Intermediate;
...@@ -24,7 +24,6 @@ interface ParaProps { ...@@ -24,7 +24,6 @@ interface ParaProps {
} }
class Para extends React.Component<ParaProps, ParaState> { class Para extends React.Component<ParaProps, ParaState> {
private paraRef = React.createRef<HTMLDivElement>(); private paraRef = React.createRef<HTMLDivElement>();
private pcs: any; private pcs: any;
...@@ -57,7 +56,7 @@ class Para extends React.Component<ParaProps, ParaState> { ...@@ -57,7 +56,7 @@ class Para extends React.Component<ParaProps, ParaState> {
this.renderParallelCoordinates(); this.renderParallelCoordinates();
}); });
} }
} };
// select all final keys // select all final keys
updateEntries = (event: React.FormEvent<HTMLDivElement>, item: any): void => { updateEntries = (event: React.FormEvent<HTMLDivElement>, item: any): void => {
...@@ -66,7 +65,7 @@ class Para extends React.Component<ParaProps, ParaState> { ...@@ -66,7 +65,7 @@ class Para extends React.Component<ParaProps, ParaState> {
this.renderParallelCoordinates(); this.renderParallelCoordinates();
}); });
} }
} };
componentDidMount(): void { componentDidMount(): void {
this.renderParallelCoordinates(); this.renderParallelCoordinates();
...@@ -86,8 +85,8 @@ class Para extends React.Component<ParaProps, ParaState> { ...@@ -86,8 +85,8 @@ class Para extends React.Component<ParaProps, ParaState> {
const { selectedPercent, noChart } = this.state; const { selectedPercent, noChart } = this.state;
return ( return (
<div className="parameter"> <div className='parameter'>
<Stack horizontal className="para-filter" horizontalAlign="end"> <Stack horizontal className='para-filter' horizontalAlign='end'>
<Dropdown <Dropdown
selectedKey={selectedPercent} selectedKey={selectedPercent}
onChange={this.percentNum} onChange={this.percentNum}
...@@ -95,15 +94,15 @@ class Para extends React.Component<ParaProps, ParaState> { ...@@ -95,15 +94,15 @@ class Para extends React.Component<ParaProps, ParaState> {
{ key: '0.01', text: 'Top 1%' }, { key: '0.01', text: 'Top 1%' },
{ key: '0.05', text: 'Top 5%' }, { key: '0.05', text: 'Top 5%' },
{ key: '0.2', text: 'Top 20%' }, { key: '0.2', text: 'Top 20%' },
{ key: '1', text: 'Top 100%' }, { key: '1', text: 'Top 100%' }
]} ]}
styles={{ dropdown: { width: 120 } }} styles={{ dropdown: { width: 120 } }}
className="para-filter-percent" className='para-filter-percent'
/> />
{this.finalKeysDropdown()} {this.finalKeysDropdown()}
</Stack> </Stack>
<div className="parcoords" style={this.chartMulineStyle} ref={this.paraRef}/> <div className='parcoords' style={this.chartMulineStyle} ref={this.paraRef} />
{noChart && <div className="nodata">No data</div>} {noChart && <div className='nodata'>No data</div>}
</div> </div>
); );
} }
...@@ -116,18 +115,19 @@ class Para extends React.Component<ParaProps, ParaState> { ...@@ -116,18 +115,19 @@ class Para extends React.Component<ParaProps, ParaState> {
const finalKeysDropdown: any = []; const finalKeysDropdown: any = [];
TRIALS.finalKeys().forEach(item => { TRIALS.finalKeys().forEach(item => {
finalKeysDropdown.push({ finalKeysDropdown.push({
key: item, text: item key: item,
text: item
}); });
}); });
return ( return (
<div> <div>
<span className="para-filter-text para-filter-middle">Metrics</span> <span className='para-filter-text para-filter-middle'>Metrics</span>
<Dropdown <Dropdown
selectedKey={primaryMetricKey} selectedKey={primaryMetricKey}
options={finalKeysDropdown} options={finalKeysDropdown}
onChange={this.updateEntries} onChange={this.updateEntries}
styles={{ root: { width: 150, display: 'inline-block' } }} styles={{ root: { width: 150, display: 'inline-block' } }}
className="para-filter-percent" className='para-filter-percent'
/> />
</div> </div>
); );
...@@ -150,13 +150,17 @@ class Para extends React.Component<ParaProps, ParaState> { ...@@ -150,13 +150,17 @@ class Para extends React.Component<ParaProps, ParaState> {
let convertedTrials = this.getTrialsAsObjectList(inferredSearchSpace, inferredMetricSpace); let convertedTrials = this.getTrialsAsObjectList(inferredSearchSpace, inferredMetricSpace);
const dimensions: [any, any][] = []; const dimensions: [any, any][] = [];
let colorDim: string | undefined = undefined, colorScale: any = undefined; let colorDim: string | undefined = undefined,
colorScale: any = undefined;
// treat every axis as numeric to fit for brush // treat every axis as numeric to fit for brush
for (const [k, v] of inferredSearchSpace.axes) { for (const [k, v] of inferredSearchSpace.axes) {
dimensions.push([k, { dimensions.push([
type: 'number', k,
yscale: this.convertToD3Scale(v) {
}]); type: 'number',
yscale: this.convertToD3Scale(v)
}
]);
} }
for (const [k, v] of inferredMetricSpace.axes) { for (const [k, v] of inferredMetricSpace.axes) {
const scale = this.convertToD3Scale(v); const scale = this.convertToD3Scale(v);
...@@ -164,7 +168,7 @@ class Para extends React.Component<ParaProps, ParaState> { ...@@ -164,7 +168,7 @@ class Para extends React.Component<ParaProps, ParaState> {
// set color for primary metrics // set color for primary metrics
// `colorScale` is used to produce a color range, while `scale` is to produce a pixel range // `colorScale` is used to produce a color range, while `scale` is to produce a pixel range
colorScale = this.convertToD3Scale(v, false); colorScale = this.convertToD3Scale(v, false);
convertedTrials.sort((a, b) => EXPERIMENT.optimizeMode === 'minimize' ? a[k] - b[k] : b[k] - a[k]); convertedTrials.sort((a, b) => (EXPERIMENT.optimizeMode === 'minimize' ? a[k] - b[k] : b[k] - a[k]));
// filter top trials // filter top trials
if (percent != 1) { if (percent != 1) {
const keptTrialNum = Math.max(Math.ceil(convertedTrials.length * percent), 1); const keptTrialNum = Math.max(Math.ceil(convertedTrials.length * percent), 1);
...@@ -179,20 +183,24 @@ class Para extends React.Component<ParaProps, ParaState> { ...@@ -179,20 +183,24 @@ class Para extends React.Component<ParaProps, ParaState> {
// reverse the converted trials to show the top ones upfront // reverse the converted trials to show the top ones upfront
convertedTrials.reverse(); convertedTrials.reverse();
const assignColors = (scale: any): void => { const assignColors = (scale: any): void => {
scale.range([0, 1]); // fake a range to perform invert scale.range([0, 1]); // fake a range to perform invert
const [scaleMin, scaleMax] = scale.domain(); const [scaleMin, scaleMax] = scale.domain();
const pivot = scale.invert(0.5); const pivot = scale.invert(0.5);
scale.domain([scaleMin, pivot, scaleMax]) scale
.domain([scaleMin, pivot, scaleMax])
.range(['#90EE90', '#FFC400', '#CA0000']) .range(['#90EE90', '#FFC400', '#CA0000'])
.interpolate(d3.interpolateHsl); .interpolate(d3.interpolateHsl);
}; };
assignColors(colorScale); assignColors(colorScale);
colorDim = k; colorDim = k;
} }
dimensions.push([k, { dimensions.push([
type: 'number', k,
yscale: scale {
}]); type: 'number',
yscale: scale
}
]);
} }
if (convertedTrials.length === 0 || dimensions.length <= 1) { if (convertedTrials.length === 0 || dimensions.length <= 1) {
...@@ -203,13 +211,15 @@ class Para extends React.Component<ParaProps, ParaState> { ...@@ -203,13 +211,15 @@ class Para extends React.Component<ParaProps, ParaState> {
if (firstRun) { if (firstRun) {
this.pcs = ParCoords()(this.paraRef.current); this.pcs = ParCoords()(this.paraRef.current);
} }
this.pcs.data(convertedTrials) this.pcs
.data(convertedTrials)
.dimensions(dimensions.reduce((obj, entry) => ({ ...obj, [entry[0]]: entry[1] }), {})); .dimensions(dimensions.reduce((obj, entry) => ({ ...obj, [entry[0]]: entry[1] }), {}));
if (firstRun) { if (firstRun) {
this.pcs.margin(this.innerChartMargins) this.pcs
.margin(this.innerChartMargins)
.alphaOnBrushed(0.2) .alphaOnBrushed(0.2)
.smoothness(0.1) .smoothness(0.1)
.brushMode("1D-axes") .brushMode('1D-axes')
.reorderable() .reorderable()
.interactive(); .interactive();
} }
...@@ -228,7 +238,7 @@ class Para extends React.Component<ParaProps, ParaState> { ...@@ -228,7 +238,7 @@ class Para extends React.Component<ParaProps, ParaState> {
return succeededTrials.map(s => { return succeededTrials.map(s => {
const entries = Array.from(s.parameters(inferredSearchSpace).entries()); const entries = Array.from(s.parameters(inferredSearchSpace).entries());
entries.push(...(Array.from(s.metrics(inferredMetricSpace).entries()))); entries.push(...Array.from(s.metrics(inferredMetricSpace).entries()));
const ret = {}; const ret = {};
for (const [k, v] of entries) { for (const [k, v] of entries) {
ret[k.fullName] = v; ret[k.fullName] = v;
...@@ -247,20 +257,26 @@ class Para extends React.Component<ParaProps, ParaState> { ...@@ -247,20 +257,26 @@ class Para extends React.Component<ParaProps, ParaState> {
private convertToD3Scale(axis: SingleAxis, initRange: boolean = true): any { private convertToD3Scale(axis: SingleAxis, initRange: boolean = true): any {
const padLinear = ([x0, x1], k = 0.1): [number, number] => { const padLinear = ([x0, x1], k = 0.1): [number, number] => {
const dx = (x1 - x0) * k / 2; const dx = ((x1 - x0) * k) / 2;
return [x0 - dx, x1 + dx]; return [x0 - dx, x1 + dx];
}; };
const padLog = ([x0, x1], k = 0.1): [number, number] => { const padLog = ([x0, x1], k = 0.1): [number, number] => {
const [y0, y1] = padLinear([Math.log(x0), Math.log(x1)], k); const [y0, y1] = padLinear([Math.log(x0), Math.log(x1)], k);
return [Math.exp(y0), Math.exp(y1)]; return [Math.exp(y0), Math.exp(y1)];
} };
let scaleInst: any = undefined; let scaleInst: any = undefined;
if (axis.scale === 'ordinal') { if (axis.scale === 'ordinal') {
if (axis.nested) { if (axis.nested) {
// TODO: handle nested entries // TODO: handle nested entries
scaleInst = d3.scalePoint().domain(Array.from(axis.domain.keys())).padding(0.2); scaleInst = d3
.scalePoint()
.domain(Array.from(axis.domain.keys()))
.padding(0.2);
} else { } else {
scaleInst = d3.scalePoint().domain(axis.domain).padding(0.2); scaleInst = d3
.scalePoint()
.domain(axis.domain)
.padding(0.2);
} }
} else if (axis.scale === 'log') { } else if (axis.scale === 'log') {
scaleInst = d3.scaleLog().domain(padLog(axis.domain)); scaleInst = d3.scaleLog().domain(padLog(axis.domain));
......
body { body {
margin: 0; margin: 0;
padding: 0; padding: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', font-family:
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', -apple-system,
sans-serif; BlinkMacSystemFont,
-webkit-font-smoothing: antialiased; 'Segoe UI',
-moz-osx-font-smoothing: grayscale; 'Roboto',
line-height: 1; 'Oxygen',
'Ubuntu',
'Cantarell',
'Fira Sans',
'Droid Sans',
'Helvetica Neue',
sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
line-height: 1;
} }
code { code {
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', font-family:
monospace; source-code-pro,
Menlo,
Monaco,
Consolas,
'Courier New',
monospace;
} }
/* http://meyerweb.com/eric/tools/css/reset/ /* http://meyerweb.com/eric/tools/css/reset/
...@@ -21,46 +35,135 @@ code { ...@@ -21,46 +35,135 @@ code {
License: none (public domain) License: none (public domain)
*/ */
html, body, div, span, applet, object, iframe, html,
h1, h2, h3, h4, h5, h6, p, blockquote, pre, body,
a, abbr, acronym, address, big, cite, code, div,
del, dfn, em, img, ins, kbd, q, s, samp, span,
small, strike, strong, sub, sup, tt, var, applet,
b, u, i, center, object,
dl, dt, dd, ol, ul, li, iframe,
fieldset, form, label, legend, h1,
table, caption, tbody, tfoot, thead, tr, th, td, h2,
article, aside, canvas, details, embed, h3,
figure, figcaption, footer, header, hgroup, h4,
main, menu, nav, output, ruby, section, summary, h5,
time, mark, audio, video { h6,
margin: 0; p,
padding: 0; blockquote,
border: 0; pre,
font: inherit; a,
font-size: 100%; abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
embed,
figure,
figcaption,
footer,
header,
hgroup,
main,
menu,
nav,
output,
ruby,
section,
summary,
time,
mark,
audio,
video {
margin: 0;
padding: 0;
border: 0;
font: inherit;
font-size: 100%;
} }
/* HTML5 display-role reset for older browsers */ /* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure, article,
footer, header, hgroup, main, menu, nav, section { aside,
display: block; details,
figcaption,
figure,
footer,
header,
hgroup,
main,
menu,
nav,
section {
display: block;
} }
/* HTML5 hidden-attribute fix for newer browsers */ /* HTML5 hidden-attribute fix for newer browsers */
*[hidden] { *[hidden] {
display: none; display: none;
} }
ol, ul {
list-style: none; ol,
ul {
list-style: none;
} }
blockquote, q {
quotes: none; blockquote,
q {
quotes: none;
} }
blockquote:before, blockquote:after,
q:before, q:after { blockquote::before,
content: ''; blockquote::after,
content: none; q::before,
q::after {
content: '';
content: none;
} }
table { table {
border-collapse: collapse; border-collapse: collapse;
border-spacing: 0; border-spacing: 0;
} }
...@@ -8,21 +8,19 @@ import './index.css'; ...@@ -8,21 +8,19 @@ import './index.css';
import * as serviceWorker from './serviceWorker'; import * as serviceWorker from './serviceWorker';
ReactDOM.render( ReactDOM.render(
(
<Router> <Router>
<App> <App>
<Switch> <Switch>
<Suspense fallback={null}> <Suspense fallback={null}>
<Route path="/oview" component={Overview} /> <Route path='/oview' component={Overview} />
<Route path="/detail" component={TrialsDetail} /> <Route path='/detail' component={TrialsDetail} />
<Route path="/" render={(): React.ReactNode => <Redirect to={{ pathname: '/oview' }} />} /> <Route path='/' render={(): React.ReactNode => <Redirect to={{ pathname: '/oview' }} />} />
</Suspense> </Suspense>
</Switch> </Switch>
</App> </App>
</Router> </Router>,
), document.getElementById('root')
document.getElementById('root')
); );
// If you want your app to work offline and load faster, you can change // If you want your app to work offline and load faster, you can change
......
declare namespace NodeJS { declare namespace NodeJS {
interface ProcessEnv { interface ProcessEnv {
readonly NODE_ENV: 'development' | 'production' | 'test'; readonly NODE_ENV: 'development' | 'production' | 'test';
readonly PUBLIC_URL: string; readonly PUBLIC_URL: string;
} }
} }
declare module '*.bmp' { declare module '*.bmp' {
const src: string; const src: string;
export default src; export default src;
} }
declare module '*.gif' { declare module '*.gif' {
const src: string; const src: string;
export default src; export default src;
} }
declare module '*.jpg' { declare module '*.jpg' {
const src: string; const src: string;
export default src; export default src;
} }
declare module '*.jpeg' { declare module '*.jpeg' {
const src: string; const src: string;
export default src; export default src;
} }
declare module '*.png' { declare module '*.png' {
const src: string; const src: string;
export default src; export default src;
} }
declare module '*.webp' { declare module '*.webp' {
...@@ -36,25 +36,25 @@ declare module '*.webp' { ...@@ -36,25 +36,25 @@ declare module '*.webp' {
} }
declare module '*.svg' { declare module '*.svg' {
import * as React from 'react'; import * as React from 'react';
export const ReactComponent: React.FunctionComponent<React.SVGProps<SVGSVGElement>>; export const ReactComponent: React.FunctionComponent<React.SVGProps<SVGSVGElement>>;
const src: string; const src: string;
export default src; export default src;
} }
declare module '*.module.css' { declare module '*.module.css' {
const classes: { [key: string]: string }; const classes: { [key: string]: string };
export default classes; export default classes;
} }
declare module '*.module.scss' { declare module '*.module.scss' {
const classes: { [key: string]: string }; const classes: { [key: string]: string };
export default classes; export default classes;
} }
declare module '*.module.sass' { declare module '*.module.sass' {
const classes: { [key: string]: string }; const classes: { [key: string]: string };
export default classes; export default classes;
} }
...@@ -15,15 +15,11 @@ const trialJobStatus = [ ...@@ -15,15 +15,11 @@ const trialJobStatus = [
'SYS_CANCELED', 'SYS_CANCELED',
'EARLY_STOPPED' 'EARLY_STOPPED'
]; ];
const CONTROLTYPE = [ const CONTROLTYPE = ['SEARCH_SPACE', 'TRIAL_CONCURRENCY', 'MAX_EXEC_DURATION'];
'SEARCH_SPACE',
'TRIAL_CONCURRENCY',
'MAX_EXEC_DURATION'
];
const MONACO = { const MONACO = {
readOnly: true, readOnly: true,
automaticLayout: true, automaticLayout: true,
scrollBeyondLastLine: false, scrollBeyondLastLine: false
}; };
const DRAWEROPTION = { const DRAWEROPTION = {
minimap: { enabled: false }, minimap: { enabled: false },
...@@ -34,8 +30,17 @@ const OPERATION = 'Operation'; ...@@ -34,8 +30,17 @@ const OPERATION = 'Operation';
// defatult selected column // defatult selected column
const COLUMN = ['Trial No.', 'ID', 'Duration', 'Status', 'Default', OPERATION]; const COLUMN = ['Trial No.', 'ID', 'Duration', 'Status', 'Default', OPERATION];
// all choice column !dictory final // all choice column !dictory final
const COLUMNPro = ['Trial No.', 'ID', 'Start time', 'End time', 'Duration', 'Status', const COLUMNPro = [
'Intermediate result', 'Default', OPERATION]; 'Trial No.',
'ID',
'Start time',
'End time',
'Duration',
'Status',
'Intermediate result',
'Default',
OPERATION
];
const CONCURRENCYTOOLTIP = 'Trial concurrency is the number of trials running concurrently.'; const CONCURRENCYTOOLTIP = 'Trial concurrency is the number of trials running concurrently.';
const SUPPORTED_SEARCH_SPACE_TYPE = [ const SUPPORTED_SEARCH_SPACE_TYPE = [
'choice', 'choice',
...@@ -53,8 +58,18 @@ const SUPPORTED_SEARCH_SPACE_TYPE = [ ...@@ -53,8 +58,18 @@ const SUPPORTED_SEARCH_SPACE_TYPE = [
]; ];
export { export {
MANAGER_IP, DOWNLOAD_IP, trialJobStatus, COLUMNPro, WEBUIDOC, MANAGER_IP,
CONTROLTYPE, MONACO, COLUMN, DRAWEROPTION, OPERATION, DOWNLOAD_IP,
METRIC_GROUP_UPDATE_THRESHOLD, METRIC_GROUP_UPDATE_SIZE, CONCURRENCYTOOLTIP, trialJobStatus,
COLUMNPro,
WEBUIDOC,
CONTROLTYPE,
MONACO,
COLUMN,
DRAWEROPTION,
OPERATION,
METRIC_GROUP_UPDATE_THRESHOLD,
METRIC_GROUP_UPDATE_SIZE,
CONCURRENCYTOOLTIP,
SUPPORTED_SEARCH_SPACE_TYPE SUPPORTED_SEARCH_SPACE_TYPE
}; };
...@@ -24,7 +24,7 @@ const convertTime = (num: number): string => { ...@@ -24,7 +24,7 @@ const convertTime = (num: number): string => {
return num / 3600 + 'h'; return num / 3600 + 'h';
} else { } else {
const hour = Math.floor(num / 3600); const hour = Math.floor(num / 3600);
const min = Math.floor(num / 60 % 60); const min = Math.floor((num / 60) % 60);
return hour > 0 ? `${hour}h ${min}min` : `${min}min`; return hour > 0 ? `${hour}h ${min}min` : `${min}min`;
} }
}; };
...@@ -35,7 +35,7 @@ const convertDuration = (num: number): string => { ...@@ -35,7 +35,7 @@ const convertDuration = (num: number): string => {
return '0s'; return '0s';
} }
const hour = Math.floor(num / 3600); const hour = Math.floor(num / 3600);
const minute = Math.floor(num / 60 % 60); const minute = Math.floor((num / 60) % 60);
const second = Math.floor(num % 60); const second = Math.floor(num % 60);
const result: string[] = []; const result: string[] = [];
if (hour > 0) { if (hour > 0) {
...@@ -60,7 +60,7 @@ function parseMetrics(metricData: string): any { ...@@ -60,7 +60,7 @@ function parseMetrics(metricData: string): any {
const isArrayType = (list: any): boolean | undefined => { const isArrayType = (list: any): boolean | undefined => {
return Array.isArray(list); return Array.isArray(list);
} };
// get final result value // get final result value
// draw Accuracy point graph // draw Accuracy point graph
...@@ -69,11 +69,11 @@ const getFinalResult = (final?: MetricDataRecord[]): number => { ...@@ -69,11 +69,11 @@ const getFinalResult = (final?: MetricDataRecord[]): number => {
let showDefault = 0; let showDefault = 0;
if (final) { if (final) {
acc = parseMetrics(final[final.length - 1].data); acc = parseMetrics(final[final.length - 1].data);
if (typeof (acc) === 'object' && !isArrayType(acc)) { if (typeof acc === 'object' && !isArrayType(acc)) {
if (acc.default) { if (acc.default) {
showDefault = acc.default; showDefault = acc.default;
} }
} else if (typeof (acc) === 'number') { } else if (typeof acc === 'number') {
showDefault = acc; showDefault = acc;
} else { } else {
showDefault = NaN; showDefault = NaN;
...@@ -94,7 +94,7 @@ const getFinal = (final?: MetricDataRecord[]): FinalType | undefined => { ...@@ -94,7 +94,7 @@ const getFinal = (final?: MetricDataRecord[]): FinalType | undefined => {
if (final) { if (final) {
showDefault = parseMetrics(final[final.length - 1].data); showDefault = parseMetrics(final[final.length - 1].data);
if (typeof showDefault === 'number') { if (typeof showDefault === 'number') {
if(!isNaNorInfinity(showDefault)){ if (!isNaNorInfinity(showDefault)) {
return { default: showDefault }; return { default: showDefault };
} }
} else if (isArrayType(showDefault)) { } else if (isArrayType(showDefault)) {
...@@ -121,7 +121,7 @@ const intermediateGraphOption = (intermediateArr: number[], id: string): any => ...@@ -121,7 +121,7 @@ const intermediateGraphOption = (intermediateArr: number[], id: string): any =>
left: 'center', left: 'center',
textStyle: { textStyle: {
fontSize: 16, fontSize: 16,
color: '#333', color: '#333'
} }
}, },
tooltip: { tooltip: {
...@@ -137,11 +137,13 @@ const intermediateGraphOption = (intermediateArr: number[], id: string): any => ...@@ -137,11 +137,13 @@ const intermediateGraphOption = (intermediateArr: number[], id: string): any =>
data: intermediateArr, data: intermediateArr,
scale: true scale: true
}, },
series: [{ series: [
symbolSize: 6, {
type: 'scatter', symbolSize: 6,
data: intermediateArr type: 'scatter',
}] data: intermediateArr
}
]
}; };
}; };
...@@ -159,7 +161,7 @@ const killJob = (key: number, id: string, status: string, updateList?: Function) ...@@ -159,7 +161,7 @@ const killJob = (key: number, id: string, status: string, updateList?: Function)
alert('Cancel the job successfully'); alert('Cancel the job successfully');
// render the table // render the table
if (updateList) { if (updateList) {
updateList(); // FIXME updateList(); // FIXME
} }
} else { } else {
alert('fail to cancel the job'); alert('fail to cancel the job');
...@@ -180,7 +182,7 @@ const filterByStatus = (item: TableObj): boolean => { ...@@ -180,7 +182,7 @@ const filterByStatus = (item: TableObj): boolean => {
return item.status === 'SUCCEEDED'; return item.status === 'SUCCEEDED';
}; };
// a waittiong trial may havn't start time // a waittiong trial may havn't start time
const filterDuration = (item: TableObj): boolean => { const filterDuration = (item: TableObj): boolean => {
return item.status !== 'WAITING'; return item.status !== 'WAITING';
}; };
...@@ -197,7 +199,7 @@ const downFile = (content: string, fileName: string): void => { ...@@ -197,7 +199,7 @@ const downFile = (content: string, fileName: string): void => {
} }
if (navigator.userAgent.indexOf('Firefox') > -1) { if (navigator.userAgent.indexOf('Firefox') > -1) {
const downTag = document.createElement('a'); const downTag = document.createElement('a');
downTag.addEventListener('click', function () { downTag.addEventListener('click', function() {
downTag.download = fileName; downTag.download = fileName;
downTag.href = URL.createObjectURL(file); downTag.href = URL.createObjectURL(file);
}); });
...@@ -227,7 +229,10 @@ function metricAccuracy(metric: MetricDataRecord): number { ...@@ -227,7 +229,10 @@ function metricAccuracy(metric: MetricDataRecord): number {
function formatAccuracy(accuracy: number): string { function formatAccuracy(accuracy: number): string {
// TODO: how to format NaN? // TODO: how to format NaN?
return accuracy.toFixed(6).replace(/0+$/, '').replace(/\.$/, ''); return accuracy
.toFixed(6)
.replace(/0+$/, '')
.replace(/\.$/, '');
} }
function formatComplexTypeValue(value: any): string | number { function formatComplexTypeValue(value: any): string | number {
...@@ -239,8 +244,21 @@ function formatComplexTypeValue(value: any): string | number { ...@@ -239,8 +244,21 @@ function formatComplexTypeValue(value: any): string | number {
} }
export { export {
convertTime, convertDuration, getFinalResult, getFinal, downFile, convertTime,
intermediateGraphOption, killJob, filterByStatus, filterDuration, convertDuration,
formatAccuracy, formatTimestamp, metricAccuracy, parseMetrics, getFinalResult,
isArrayType, requestAxios, isNaNorInfinity, formatComplexTypeValue getFinal,
downFile,
intermediateGraphOption,
killJob,
filterByStatus,
filterDuration,
formatAccuracy,
formatTimestamp,
metricAccuracy,
parseMetrics,
isArrayType,
requestAxios,
isNaNorInfinity,
formatComplexTypeValue
}; };
...@@ -33,7 +33,7 @@ interface TableObj { ...@@ -33,7 +33,7 @@ interface TableObj {
color?: string; color?: string;
startTime?: number; startTime?: number;
endTime?: number; endTime?: number;
parameters(axes: MultipleAxes): Map<SingleAxis, any>; parameters(axes: MultipleAxes): Map<SingleAxis, any>;
metrics(axes: MultipleAxes): Map<SingleAxis, any>; metrics(axes: MultipleAxes): Map<SingleAxis, any>;
} }
...@@ -208,8 +208,25 @@ interface EventMap { ...@@ -208,8 +208,25 @@ interface EventMap {
} }
export { export {
TableObj, TableRecord, SearchSpace, FinalType, ErrorParameter, Parameters, TableObj,
AccurPoint, DetailAccurPoint, TooltipForIntermediate, TooltipForAccuracy, TableRecord,
Dimobj, ParaObj, Intermedia, MetricDataRecord, TrialJobInfo, ExperimentParams, SearchSpace,
ExperimentProfile, NNIManagerStatus, EventMap, SingleAxis, MultipleAxes FinalType,
ErrorParameter,
Parameters,
AccurPoint,
DetailAccurPoint,
TooltipForIntermediate,
TooltipForAccuracy,
Dimobj,
ParaObj,
Intermedia,
MetricDataRecord,
TrialJobInfo,
ExperimentParams,
ExperimentProfile,
NNIManagerStatus,
EventMap,
SingleAxis,
MultipleAxes
}; };
...@@ -87,17 +87,33 @@ class Experiment { ...@@ -87,17 +87,33 @@ class Experiment {
// set initProfile to prevent page broken // set initProfile to prevent page broken
const initProfile = { const initProfile = {
data: { data: {
"id": "", "revision": 0, "execDuration": 0, id: '',
"logDir": "", "nextSequenceId": 0, revision: 0,
"params": { execDuration: 0,
"authorName": "", "experimentName": "", "trialConcurrency": 0, "maxExecDuration": 0, "maxTrialNum": 0, "searchSpace": "null", logDir: '',
"trainingServicePlatform": "", "tuner": { nextSequenceId: 0,
"builtinTunerName": "TPE", params: {
"classArgs": { "optimize_mode": "" }, "checkpointDir": "" authorName: '',
experimentName: '',
trialConcurrency: 0,
maxExecDuration: 0,
maxTrialNum: 0,
searchSpace: 'null',
trainingServicePlatform: '',
tuner: {
builtinTunerName: 'TPE',
// eslint-disable-next-line @typescript-eslint/camelcase
classArgs: { optimize_mode: '' },
checkpointDir: ''
}, },
"versionCheck": true, "clusterMetaData": [{ "key": "", "value": "" }, versionCheck: true,
{ "key": "", "value": "" }] clusterMetaData: [
}, "startTime": 0, "endTime": 0 { key: '', value: '' },
{ key: '', value: '' }
]
},
startTime: 0,
endTime: 0
} }
}; };
this.profileField = initProfile.data as any; this.profileField = initProfile.data as any;
...@@ -112,7 +128,7 @@ class Experiment { ...@@ -112,7 +128,7 @@ class Experiment {
get optimizeMode(): string { get optimizeMode(): string {
const tuner = this.profile.params.tuner; const tuner = this.profile.params.tuner;
return (tuner && tuner.classArgs && tuner.classArgs.optimize_mode) ? tuner.classArgs.optimize_mode : 'unknown'; return tuner && tuner.classArgs && tuner.classArgs.optimize_mode ? tuner.classArgs.optimize_mode : 'unknown';
} }
get trainingServicePlatform(): string { get trainingServicePlatform(): string {
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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