"official/projects/labse/train.py" did not exist on "63620f4ce55a608e76c0ff4a76d64d90507bf997"
Overview.tsx 10.4 KB
Newer Older
Lijiao's avatar
Lijiao committed
1
import * as React from 'react';
2
import { Stack, Icon, Dropdown, DefaultButton } from '@fluentui/react';
Lijiaoa's avatar
Lijiaoa committed
3
4
5
6
7
8
9
10
11
12
import { EXPERIMENT, TRIALS } from '@static/datamodel';
import { Trial } from '@static/model/trial';
import { AppContext } from '@/App';
import { Title } from './Title';
import SuccessTable from './table/SuccessTable';
import DefaultPoint from '../trialdetail/chart/DefaultMetricPoint';
import { BasicInfo } from './params/BasicInfo';
import { ExpDuration } from './count/ExpDuration';
import { ExpDurationContext } from './count/ExpDurationContext';
import { TrialCount } from './count/TrialCount';
13
import Config from './Config';
Lijiaoa's avatar
Lijiaoa committed
14
15
16
17
import { TitleContext } from './TitleContext';
import { itemStyleSucceed, entriesOption } from './overviewConst';
import '@style/experiment/overview/overview.scss';
import '@style/experiment/overview/topTrial.scss';
18
import '@style/table.scss';
Lijiaoa's avatar
Lijiaoa committed
19
20
21
22
23

/**
 * single experiment
 * overview page
 */
Lijiao's avatar
Lijiao committed
24

25
26
interface OverviewState {
    trialConcurrency: number;
27
28
}

29
30
export const BestMetricContext = React.createContext({
    bestAccuracy: 0
31
32
33
34
});

class Overview extends React.Component<{}, OverviewState> {
    static contextType = AppContext;
35
    context!: React.ContextType<typeof AppContext>;
36
37

    constructor(props) {
Lijiao's avatar
Lijiao committed
38
39
        super(props);
        this.state = {
Lijiao's avatar
Lijiao committed
40
            trialConcurrency: EXPERIMENT.trialConcurrency
Lijiao's avatar
Lijiao committed
41
42
43
        };
    }

Lijiao's avatar
Lijiao committed
44
    clickMaxTop = (event: React.SyntheticEvent<EventTarget>): void => {
45
46
        event.stopPropagation();
        // #999 panel active bgcolor; #b3b3b3 as usual
47
        const { changeMetricGraphMode } = this.context;
Lijiao's avatar
Lijiao committed
48
        changeMetricGraphMode('max');
49
    };
Lijiaoa's avatar
Lijiaoa committed
50

Lijiao's avatar
Lijiao committed
51
    clickMinTop = (event: React.SyntheticEvent<EventTarget>): void => {
52
        event.stopPropagation();
53
        const { changeMetricGraphMode } = this.context;
Lijiao's avatar
Lijiao committed
54
        changeMetricGraphMode('min');
55
    };
56

Lijiaoa's avatar
Lijiaoa committed
57
58
    updateEntries = (event: React.FormEvent<HTMLDivElement>, item: any): void => {
        if (item !== undefined) {
59
            this.context.changeEntries(item.key);
Lijiaoa's avatar
Lijiaoa committed
60
        }
61
    };
Lijiaoa's avatar
Lijiaoa committed
62

Lijiao's avatar
Lijiao committed
63
    render(): React.ReactNode {
64
        const bestTrials = this.findBestTrials();
Lijiao's avatar
Lijiao committed
65
        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
66
        const bestAccuracy = bestTrials.length > 0 ? bestTrials[0].accuracy! : NaN;
67
        const execDuration = EXPERIMENT.profile.execDuration;
68

Lijiao's avatar
Lijiao committed
69
        return (
70
71
            <AppContext.Consumer>
                {(value): React.ReactNode => {
72
73
74
75
                    const {
                        metricGraphMode,
                        bestTrialEntries,
                        maxDurationUnit,
76
                        expandRowIDs,
77
                        updateOverviewPage,
78
79
                        changeMaxDurationUnit,
                        changeExpandRowIDs
80
                    } = value;
81
82
                    const maxActive = metricGraphMode === 'max' ? 'active' : '';
                    const minActive = metricGraphMode === 'min' ? 'active' : '';
83
                    return (
84
                        <div className='overview'>
85
                            <div className='overviewWrapper'>
86
87
88
89
                                {/* exp params */}
                                <div className='overviewBasicInfo'>
                                    <TitleContext.Provider value={{ text: 'Experiment', icon: 'AutoRacing' }}>
                                        <Title />
90
                                    </TitleContext.Provider>
91
                                    <BestMetricContext.Provider value={{ bestAccuracy: bestAccuracy }}>
92
                                        <BasicInfo />
93
94
95
                                    </BestMetricContext.Provider>
                                </div>
                                {/* duration & trial numbers */}
Lijiaoa's avatar
Lijiaoa committed
96
97
98
99
100
101
                                <div className='duration'>
                                    <TitleContext.Provider value={{ text: 'Duration', icon: 'Timer' }}>
                                        <Title />
                                    </TitleContext.Provider>
                                    <ExpDurationContext.Provider
                                        value={{
102
                                            maxExecDuration: EXPERIMENT.maxExperimentDurationSeconds,
Lijiaoa's avatar
Lijiaoa committed
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
                                            execDuration,
                                            updateOverviewPage,
                                            maxDurationUnit,
                                            changeMaxDurationUnit
                                        }}
                                    >
                                        <ExpDuration />
                                    </ExpDurationContext.Provider>
                                </div>
                                <div className='trialCount'>
                                    <TitleContext.Provider value={{ text: 'Trial numbers', icon: 'NumberSymbol' }}>
                                        <Title />
                                    </TitleContext.Provider>
                                    <ExpDurationContext.Provider
                                        value={{
118
                                            maxExecDuration: EXPERIMENT.maxExperimentDurationSeconds,
Lijiaoa's avatar
Lijiaoa committed
119
120
121
122
123
124
125
126
                                            execDuration,
                                            updateOverviewPage,
                                            maxDurationUnit,
                                            changeMaxDurationUnit
                                        }}
                                    >
                                        <TrialCount />
                                    </ExpDurationContext.Provider>
127
128
                                </div>
                                {/* table */}
Lijiaoa's avatar
Lijiaoa committed
129
                                <div className='overviewBestMetric'>
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
                                    <Stack horizontal>
                                        <div style={itemStyleSucceed}>
                                            <TitleContext.Provider value={{ text: 'Top trials', icon: 'BulletedList' }}>
                                                <Title />
                                            </TitleContext.Provider>
                                        </div>
                                        <div className='topTrialTitle'>
                                            <Stack horizontal horizontalAlign='end'>
                                                <DefaultButton
                                                    onClick={this.clickMaxTop}
                                                    className={maxActive}
                                                    styles={{ root: { minWidth: 70, padding: 0 } }}
                                                >
                                                    <Icon iconName='Market' />
                                                    <span className='max'>Max</span>
                                                </DefaultButton>
                                                <div className='mincenter'>
                                                    <DefaultButton
                                                        onClick={this.clickMinTop}
                                                        className={minActive}
                                                        styles={{ root: { minWidth: 70, padding: 0 } }}
                                                    >
                                                        <Icon iconName='MarketDown' />
                                                        <span className='max'>Min</span>
                                                    </DefaultButton>
                                                </div>
                                                <div>
                                                    <Stack horizontal>
                                                        <div className='chooseEntry'>Display top</div>
                                                        <div>
                                                            <Dropdown
                                                                selectedKey={bestTrialEntries}
                                                                options={entriesOption}
                                                                onChange={this.updateEntries}
                                                                styles={{ root: { width: 70 } }}
                                                            />
                                                        </div>
                                                    </Stack>
                                                </div>
                                            </Stack>
                                        </div>
                                    </Stack>
Lijiaoa's avatar
Lijiaoa committed
172
                                    <div className='overviewChart'>
173
174
175
176
                                        <DefaultPoint
                                            trialIds={bestTrials.map(trial => trial.info.trialJobId)}
                                            chartHeight={300}
                                            hasBestCurve={false}
177
                                            changeExpandRowIDs={changeExpandRowIDs}
178
                                        />
179
180
181
                                        <SuccessTable
                                            trialIds={bestTrials.map(trial => trial.info.trialJobId)}
                                            updateOverviewPage={updateOverviewPage}
182
183
                                            expandRowIDs={expandRowIDs}
                                            changeExpandRowIDs={changeExpandRowIDs}
184
                                        />
Lijiaoa's avatar
Lijiaoa committed
185
                                    </div>
186
                                </div>
187
188
                                <Stack className='overviewCommand'>
                                    <Config />
189
                                </Stack>
190
                            </div>
191
                        </div>
192
193
                    );
                }}
194
            </AppContext.Consumer>
Lijiao's avatar
Lijiao committed
195
196
        );
    }
197
198

    private findBestTrials(): Trial[] {
Lijiao's avatar
Lijiao committed
199
        const bestTrials = TRIALS.sort();
200
201
        const { bestTrialEntries, metricGraphMode } = this.context;
        if (metricGraphMode === 'max') {
Lijiaoa's avatar
Lijiaoa committed
202
            bestTrials.reverse().splice(JSON.parse(bestTrialEntries));
203
        } else {
Lijiaoa's avatar
Lijiaoa committed
204
            bestTrials.splice(JSON.parse(bestTrialEntries));
205
206
207
        }
        return bestTrials;
    }
Lijiao's avatar
Lijiao committed
208
}
209

Lijiao's avatar
Lijiao committed
210
export default Overview;