TrialsDetail.tsx 13.1 KB
Newer Older
Lijiao's avatar
Lijiao committed
1
2
3
import * as React from 'react';
import axios from 'axios';
import { MANAGER_IP } from '../static/const';
4
5
import { Row, Col, Button, Tabs, Input } from 'antd';
const Search = Input.Search;
Lijiao's avatar
Lijiao committed
6
import { TableObj, Parameters, DetailAccurPoint, TooltipForAccuracy } from '../static/interface';
Lijiao's avatar
Lijiao committed
7
import { getFinalResult } from '../static/function';
Lijiao's avatar
Lijiao committed
8
9
10
11
12
13
14
15
16
17
18
19
import Accuracy from './overview/Accuracy';
import Duration from './trial-detail/Duration';
import Title1 from './overview/Title1';
import Para from './trial-detail/Para';
import TableList from './trial-detail/TableList';
const TabPane = Tabs.TabPane;
import '../static/style/trialsDetail.scss';

interface TrialDetailState {
    accSource: object;
    accNodata: string;
    tableListSource: Array<TableObj>;
Lijiao's avatar
Lijiao committed
20
    tableBaseSource: Array<TableObj>;
21
    experimentStatus: string;
Lijiao's avatar
Lijiao committed
22
23
24
25
26
27
28
}

class TrialsDetail extends React.Component<{}, TrialDetailState> {

    public _isMounted = false;
    public interAccuracy = 0;
    public interTableList = 1;
29

Lijiao's avatar
Lijiao committed
30
31
32
33
34
35
    constructor(props: {}) {
        super(props);

        this.state = {
            accSource: {},
            accNodata: '',
Lijiao's avatar
Lijiao committed
36
            tableListSource: [],
37
38
            tableBaseSource: [],
            experimentStatus: ''
Lijiao's avatar
Lijiao committed
39
40
41
42
43
44
45
46
47
48
49
        };
    }
    // trial accuracy graph
    drawPointGraph = () => {

        axios(`${MANAGER_IP}/trial-jobs`, {
            method: 'GET'
        })
            .then(res => {
                if (res.status === 200 && this._isMounted) {
                    const accData = res.data;
50
                    const accSource: Array<DetailAccurPoint> = [];
Lijiao's avatar
Lijiao committed
51
52
                    Object.keys(accData).map(item => {
                        if (accData[item].status === 'SUCCEEDED' && accData[item].finalMetricData) {
53
                            let searchSpace: object = {};
Lijiao's avatar
Lijiao committed
54
                            const acc = getFinalResult(accData[item].finalMetricData);
55
56
57
                            if (accData[item].hyperParameters) {
                                searchSpace = JSON.parse(accData[item].hyperParameters).parameters;
                            }
Lijiao's avatar
Lijiao committed
58
                            accSource.push({
Lijiao's avatar
Lijiao committed
59
                                acc: acc,
60
61
                                index: accData[item].sequenceId,
                                searchSpace: JSON.stringify(searchSpace)
Lijiao's avatar
Lijiao committed
62
                            });
Lijiao's avatar
Lijiao committed
63
64
                        }
                    });
65
                    const resultList: Array<number | string>[] = [];
Lijiao's avatar
Lijiao committed
66
67
                    Object.keys(accSource).map(item => {
                        const items = accSource[item];
68
69
70
                        let temp: Array<number | string>;
                        temp = [items.index, items.acc, JSON.parse(items.searchSpace)];
                        resultList.push(temp);
Lijiao's avatar
Lijiao committed
71
72
73
                    });
                    const allAcuracy = {
                        tooltip: {
74
75
76
77
                            trigger: 'item',
                            enterable: true,
                            position: function (point: Array<number>, data: TooltipForAccuracy) {
                                if (data.data[0] < resultList.length / 2) {
Lijiao's avatar
Lijiao committed
78
                                    return [point[0], 80];
79
                                } else {
Lijiao's avatar
Lijiao committed
80
                                    return [point[0] - 300, 80];
81
82
83
84
85
86
87
88
89
90
91
92
                                }
                            },
                            formatter: function (data: TooltipForAccuracy) {
                                const result = '<div class="tooldetailAccuracy">' +
                                    '<div>Trial No: ' + data.data[0] + '</div>' +
                                    '<div>Default Metrc: ' + data.data[1] + '</div>' +
                                    '<div>Parameters: ' +
                                    '<pre>' + JSON.stringify(data.data[2], null, 4) + '</pre>' +
                                    '</div>' +
                                    '</div>';
                                return result;
                            }
Lijiao's avatar
Lijiao committed
93
94
95
96
97
98
                        },
                        xAxis: {
                            name: 'Trial',
                            type: 'category',
                        },
                        yAxis: {
99
                            name: 'Default Metric',
Lijiao's avatar
Lijiao committed
100
101
102
103
104
                            type: 'value',
                        },
                        series: [{
                            symbolSize: 6,
                            type: 'scatter',
105
                            data: resultList
Lijiao's avatar
Lijiao committed
106
107
108
109
                        }]
                    };

                    this.setState({ accSource: allAcuracy }, () => {
110
                        if (resultList.length === 0) {
Lijiao's avatar
Lijiao committed
111
112
113
114
115
116
117
118
119
120
121
122
123
124
                            this.setState({
                                accNodata: 'No data'
                            });
                        } else {
                            this.setState({
                                accNodata: ''
                            });
                        }
                    });
                }
            });
    }

    drawTableList = () => {
125
126
        this.isOffIntervals();
        axios.get(`${MANAGER_IP}/trial-jobs`)
Lijiao's avatar
Lijiao committed
127
128
            .then(res => {
                if (res.status === 200) {
Lijiao's avatar
Lijiao committed
129
130
131
132
133
                    const trialJobs = res.data;
                    const trialTable: Array<TableObj> = [];
                    Object.keys(trialJobs).map(item => {
                        // only succeeded trials have finalMetricData
                        let desc: Parameters = {
134
                            parameters: {}
Lijiao's avatar
Lijiao committed
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
                        };
                        let duration = 0;
                        const id = trialJobs[item].id !== undefined
                            ? trialJobs[item].id
                            : '';
                        const status = trialJobs[item].status !== undefined
                            ? trialJobs[item].status
                            : '';
                        const begin = trialJobs[item].startTime;
                        const end = trialJobs[item].endTime;
                        if (begin) {
                            if (end) {
                                duration = (end - begin) / 1000;
                            } else {
                                duration = (new Date().getTime() - begin) / 1000;
                            }
                        }
                        if (trialJobs[item].hyperParameters !== undefined) {
153
154
155
156
157
158
                            const getPara = JSON.parse(trialJobs[item].hyperParameters).parameters;
                            if (typeof getPara === 'string') {
                                desc.parameters = JSON.parse(getPara);
                            } else {
                                desc.parameters = getPara;
                            }
Lijiao's avatar
Lijiao committed
159
160
161
162
163
164
                        } else {
                            desc.parameters = { error: 'This trial\'s parameters are not available.' };
                        }
                        if (trialJobs[item].logPath !== undefined) {
                            desc.logPath = trialJobs[item].logPath;
                        }
Lijiao's avatar
Lijiao committed
165
                        const acc = getFinalResult(trialJobs[item].finalMetricData);
Lijiao's avatar
Lijiao committed
166
167
168
169
170
171
                        trialTable.push({
                            key: trialTable.length,
                            sequenceId: trialJobs[item].sequenceId,
                            id: id,
                            status: status,
                            duration: duration,
Lijiao's avatar
Lijiao committed
172
                            acc: acc,
Lijiao's avatar
Lijiao committed
173
174
175
176
177
                            description: desc
                        });
                    });
                    if (this._isMounted) {
                        this.setState(() => ({
Lijiao's avatar
Lijiao committed
178
179
                            tableListSource: trialTable,
                            tableBaseSource: trialTable
Lijiao's avatar
Lijiao committed
180
181
182
                        }));
                    }
                }
Lijiao's avatar
Lijiao committed
183
            });
Lijiao's avatar
Lijiao committed
184
185
186
187
188
189
190
191
192
193
194
195
196
    }

    callback = (key: string) => {

        switch (key) {
            case '1':
                window.clearInterval(Para.intervalIDPara);
                window.clearInterval(Duration.intervalDuration);
                this.drawPointGraph();
                this.interAccuracy = window.setInterval(this.drawPointGraph, 10000);
                break;

            case '2':
197
                this.isOffIntervals();
Lijiao's avatar
Lijiao committed
198
199
200
201
202
                window.clearInterval(this.interAccuracy);
                window.clearInterval(Duration.intervalDuration);
                break;

            case '3':
203
                this.isOffIntervals();
Lijiao's avatar
Lijiao committed
204
205
206
207
208
209
210
211
                window.clearInterval(this.interAccuracy);
                window.clearInterval(Para.intervalIDPara);
                break;

            default:
        }
    }

212
    // search a specific trial by trial No.
213
    searchTrial = (value: string) => {
214
        window.clearInterval(this.interTableList);
Lijiao's avatar
Lijiao committed
215
        const { tableBaseSource } = this.state;
216
        const searchResultList: Array<TableObj> = [];
Lijiao's avatar
Lijiao committed
217
218
        Object.keys(tableBaseSource).map(key => {
            const item = tableBaseSource[key];
219
            if (item.sequenceId.toString() === value || item.id.includes(value)) {
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
                searchResultList.push(item);
            }
        });
        this.setState(() => ({
            tableListSource: searchResultList
        }));
    }

    // reset btn click: rerender table
    resetRenderTable = () => {

        const searchInput = document.getElementById('searchTrial') as HTMLInputElement;
        if (searchInput !== null) {
            searchInput.value = '';
        }
        this.drawTableList();
        this.interTableList = window.setInterval(this.drawTableList, 10000);
    }
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259

    isOffIntervals = () => {
        axios(`${MANAGER_IP}/check-status`, {
            method: 'GET'
        })
            .then(res => {
                if (res.status === 200 && this._isMounted) {
                    switch (res.data.status) {
                        case 'DONE':
                        case 'ERROR':
                        case 'STOPPED':
                            window.clearInterval(this.interAccuracy);
                            window.clearInterval(this.interTableList);
                            window.clearInterval(Duration.intervalDuration);
                            window.clearInterval(Para.intervalIDPara);
                            break;
                        default:
                    }
                }
            });
    }

Lijiao's avatar
Lijiao committed
260
261
262
263
    componentDidMount() {

        this._isMounted = true;
        this.drawTableList();
264
        this.drawPointGraph();
Lijiao's avatar
Lijiao committed
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
        this.interAccuracy = window.setInterval(this.drawPointGraph, 10000);
        this.interTableList = window.setInterval(this.drawTableList, 10000);
    }

    componentWillUnmount() {
        this._isMounted = false;
        window.clearInterval(this.interTableList);
        window.clearInterval(this.interAccuracy);
    }

    render() {
        const {
            accSource, accNodata,
            tableListSource
        } = this.state;
Lijiao's avatar
Lijiao committed
280

Lijiao's avatar
Lijiao committed
281
        const titleOfacc = (
282
            <Title1 text="Default Metric" icon="3.png" />
Lijiao's avatar
Lijiao committed
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
        );
        const titleOfhyper = (
            <Title1 text="Hyper Parameter" icon="1.png" />
        );
        const titleOfDuration = (
            <Title1 text="Trial Duration" icon="2.png" />
        );
        return (
            <div>
                <div className="trial" id="tabsty">
                    <Tabs onChange={this.callback} type="card">
                        <TabPane tab={titleOfacc} key="1">
                            <Row className="graph">
                                <Accuracy
                                    height={432}
                                    accuracyData={accSource}
                                    accNodata={accNodata}
                                />
                            </Row>
                        </TabPane>
                        <TabPane tab={titleOfhyper} key="2">
                            <Row className="graph"><Para /></Row>
                        </TabPane>
                        <TabPane tab={titleOfDuration} key="3">
                            <Duration />
                        </TabPane>
                    </Tabs>
                </div>
                {/* trial table list */}
312
313
314
315
316
317
                <Row className="allList">
                    <Col span={12}>
                        <Title1 text="All Trials" icon="6.png" />
                    </Col>
                    <Col span={12} className="btns">
                        <Search
318
319
                            placeholder="search by Trial No. and id"
                            onSearch={value => this.searchTrial(value)}
320
321
322
323
324
325
326
327
328
329
330
331
                            style={{ width: 200 }}
                            id="searchTrial"
                        />
                        <Button
                            type="primary"
                            className="tableButton resetBtn"
                            onClick={this.resetRenderTable}
                        >
                            Reset
                        </Button>
                    </Col>
                </Row>
Lijiao's avatar
Lijiao committed
332
333
334
335
336
337
338
339
340
341
                <TableList
                    tableSource={tableListSource}
                    updateList={this.drawTableList}
                />
            </div>
        );
    }
}

export default TrialsDetail;