Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
OpenDAS
nni
Commits
ba8dccd6
Commit
ba8dccd6
authored
Jun 23, 2019
by
suiguoxin
Browse files
Merge branch 'master' of
https://github.com/microsoft/nni
parents
56a1575b
150ee83a
Changes
208
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
594 additions
and
303 deletions
+594
-303
src/webui/src/App.css
src/webui/src/App.css
+2
-6
src/webui/src/App.tsx
src/webui/src/App.tsx
+43
-4
src/webui/src/components/Overview.tsx
src/webui/src/components/Overview.tsx
+50
-27
src/webui/src/components/SlideBar.tsx
src/webui/src/components/SlideBar.tsx
+351
-220
src/webui/src/components/TrialsDetail.tsx
src/webui/src/components/TrialsDetail.tsx
+37
-19
src/webui/src/components/overview/Progress.tsx
src/webui/src/components/overview/Progress.tsx
+1
-1
src/webui/src/components/overview/SuccessTable.tsx
src/webui/src/components/overview/SuccessTable.tsx
+9
-2
src/webui/src/components/public-child/TrialLog.tsx
src/webui/src/components/public-child/TrialLog.tsx
+1
-1
src/webui/src/components/trial-detail/TableList.tsx
src/webui/src/components/trial-detail/TableList.tsx
+2
-1
src/webui/src/index.css
src/webui/src/index.css
+3
-3
src/webui/src/static/function.ts
src/webui/src/static/function.ts
+1
-1
src/webui/src/static/interface.ts
src/webui/src/static/interface.ts
+1
-1
src/webui/src/static/style/openRow.scss
src/webui/src/static/style/openRow.scss
+1
-1
src/webui/src/static/style/overview.scss
src/webui/src/static/style/overview.scss
+1
-1
src/webui/src/static/style/overviewTitle.scss
src/webui/src/static/style/overviewTitle.scss
+1
-1
src/webui/src/static/style/para.scss
src/webui/src/static/style/para.scss
+3
-3
src/webui/src/static/style/progress.scss
src/webui/src/static/style/progress.scss
+1
-1
src/webui/src/static/style/slideBar.scss
src/webui/src/static/style/slideBar.scss
+81
-5
src/webui/src/static/style/table.scss
src/webui/src/static/style/table.scss
+4
-4
test/async_sharing_test/config.yml
test/async_sharing_test/config.yml
+1
-1
No files found.
src/webui/src/App.css
View file @
ba8dccd6
...
@@ -10,14 +10,12 @@
...
@@ -10,14 +10,12 @@
left
:
0
;
left
:
0
;
top
:
0
;
top
:
0
;
width
:
100%
;
width
:
100%
;
height
:
56px
;
height
:
56px
;
background
:
#0071BC
;
background
:
#0071BC
;
border-right
:
1px
solid
#ccc
;
border-right
:
1px
solid
#ccc
;
z-index
:
1000
;
z-index
:
1000
;
}
}
.headerCon
{
min-width
:
1024px
;
}
.contentBox
{
.contentBox
{
width
:
100%
;
width
:
100%
;
}
}
...
@@ -29,5 +27,3 @@
...
@@ -29,5 +27,3 @@
margin-bottom
:
30px
;
margin-bottom
:
30px
;
background
:
#fff
;
background
:
#fff
;
}
}
src/webui/src/App.tsx
View file @
ba8dccd6
...
@@ -3,20 +3,59 @@ import { Row, Col } from 'antd';
...
@@ -3,20 +3,59 @@ import { Row, Col } from 'antd';
import
'
./App.css
'
;
import
'
./App.css
'
;
import
SlideBar
from
'
./components/SlideBar
'
;
import
SlideBar
from
'
./components/SlideBar
'
;
class
App
extends
React
.
Component
<
{},
{}
>
{
interface
AppState
{
interval
:
number
;
whichPageToFresh
:
string
;
}
class
App
extends
React
.
Component
<
{},
AppState
>
{
public
_isMounted
:
boolean
;
constructor
(
props
:
{})
{
super
(
props
);
this
.
state
=
{
interval
:
10
,
// sendons
whichPageToFresh
:
''
};
}
changeInterval
=
(
interval
:
number
)
=>
{
if
(
this
.
_isMounted
===
true
)
{
this
.
setState
(()
=>
({
interval
:
interval
}));
}
}
changeFresh
=
(
fresh
:
string
)
=>
{
// interval * 1000
if
(
this
.
_isMounted
===
true
)
{
this
.
setState
(()
=>
({
whichPageToFresh
:
fresh
}));
}
}
componentDidMount
()
{
this
.
_isMounted
=
true
;
}
componentWillUnmount
()
{
this
.
_isMounted
=
false
;
}
render
()
{
render
()
{
const
{
interval
,
whichPageToFresh
}
=
this
.
state
;
const
reactPropsChildren
=
React
.
Children
.
map
(
this
.
props
.
children
,
child
=>
// tslint:disable-next-line:no-any
React
.
cloneElement
(
child
as
React
.
ReactElement
<
any
>
,
{
interval
,
whichPageToFresh
})
);
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
/>
<
SlideBar
changeInterval
=
{
this
.
changeInterval
}
changeFresh
=
{
this
.
changeFresh
}
/>
</
Col
>
</
Col
>
<
Col
span
=
{
1
}
/>
<
Col
span
=
{
1
}
/>
</
Row
>
</
Row
>
<
Row
className
=
"contentBox"
>
<
Row
className
=
"contentBox"
>
<
Row
className
=
"content"
>
<
Row
className
=
"content"
>
{
this
.
p
rops
.
c
hildren
}
{
reactP
rops
C
hildren
}
</
Row
>
</
Row
>
</
Row
>
</
Row
>
</
Row
>
</
Row
>
...
...
src/webui/src/components/Overview.tsx
View file @
ba8dccd6
...
@@ -39,13 +39,18 @@ interface OverviewState {
...
@@ -39,13 +39,18 @@ interface OverviewState {
isMultiPhase
:
boolean
;
isMultiPhase
:
boolean
;
}
}
class
Overview
extends
React
.
Component
<
{},
OverviewState
>
{
interface
OverviewProps
{
interval
:
number
;
// user select
whichPageToFresh
:
string
;
}
class
Overview
extends
React
.
Component
<
OverviewProps
,
OverviewState
>
{
public
_isMounted
=
false
;
public
_isMounted
=
false
;
public
intervalID
=
0
;
public
intervalID
=
0
;
public
intervalProfile
=
1
;
public
intervalProfile
=
1
;
constructor
(
props
:
{}
)
{
constructor
(
props
:
OverviewProps
)
{
super
(
props
);
super
(
props
);
this
.
state
=
{
this
.
state
=
{
searchSpace
:
{},
searchSpace
:
{},
...
@@ -377,17 +382,19 @@ class Overview extends React.Component<{}, OverviewState> {
...
@@ -377,17 +382,19 @@ class Overview extends React.Component<{}, OverviewState> {
data
:
accarr
data
:
accarr
}]
}]
};
};
this
.
setState
({
accuracyData
:
accOption
},
()
=>
{
if
(
this
.
_isMounted
)
{
if
(
accarr
.
length
===
0
)
{
this
.
setState
({
accuracyData
:
accOption
},
()
=>
{
this
.
setState
({
if
(
accarr
.
length
===
0
)
{
accNodata
:
'
No data
'
this
.
setState
({
});
accNodata
:
'
No data
'
}
else
{
});
this
.
setState
({
}
else
{
accNodata
:
''
this
.
setState
({
});
accNodata
:
''
}
});
});
}
});
}
}
}
clickMaxTop
=
(
event
:
React
.
SyntheticEvent
<
EventTarget
>
)
=>
{
clickMaxTop
=
(
event
:
React
.
SyntheticEvent
<
EventTarget
>
)
=>
{
...
@@ -405,23 +412,39 @@ class Overview extends React.Component<{}, OverviewState> {
...
@@ -405,23 +412,39 @@ class Overview extends React.Component<{}, OverviewState> {
isOffInterval
=
()
=>
{
isOffInterval
=
()
=>
{
const
{
status
}
=
this
.
state
;
const
{
status
}
=
this
.
state
;
switch
(
status
)
{
const
{
interval
}
=
this
.
props
;
case
'
DONE
'
:
if
(
status
===
'
DONE
'
||
status
===
'
ERROR
'
||
status
===
'
STOPPED
'
||
case
'
ERROR
'
:
interval
===
0
case
'
STOPPED
'
:
)
{
window
.
clearInterval
(
this
.
intervalID
);
window
.
clearInterval
(
this
.
intervalID
);
window
.
clearInterval
(
this
.
intervalProfile
);
window
.
clearInterval
(
this
.
intervalProfile
);
break
;
return
;
default
:
}
}
componentWillReceiveProps
(
nextProps
:
OverviewProps
)
{
const
{
interval
,
whichPageToFresh
}
=
nextProps
;
window
.
clearInterval
(
this
.
intervalID
);
window
.
clearInterval
(
this
.
intervalProfile
);
if
(
whichPageToFresh
.
includes
(
'
/oview
'
))
{
this
.
showTrials
();
this
.
showSessionPro
();
}
if
(
interval
!==
0
)
{
this
.
intervalID
=
window
.
setInterval
(
this
.
showTrials
,
interval
*
1000
);
this
.
intervalProfile
=
window
.
setInterval
(
this
.
showSessionPro
,
interval
*
1000
);
}
}
}
}
componentDidMount
()
{
componentDidMount
()
{
this
.
_isMounted
=
true
;
this
.
_isMounted
=
true
;
this
.
showSessionPro
()
;
const
{
interval
}
=
this
.
props
;
this
.
showTrials
();
this
.
showTrials
();
this
.
intervalID
=
window
.
setInterval
(
this
.
showTrials
,
10000
);
this
.
showSessionPro
();
this
.
intervalProfile
=
window
.
setInterval
(
this
.
showSessionPro
,
60000
);
if
(
interval
!==
0
)
{
this
.
intervalID
=
window
.
setInterval
(
this
.
showTrials
,
interval
*
1000
);
this
.
intervalProfile
=
window
.
setInterval
(
this
.
showSessionPro
,
interval
*
1000
);
}
}
}
componentWillUnmount
()
{
componentWillUnmount
()
{
...
@@ -447,7 +470,7 @@ class Overview extends React.Component<{}, OverviewState> {
...
@@ -447,7 +470,7 @@ class Overview extends React.Component<{}, OverviewState> {
</
Row
>
</
Row
>
<
Row
className
=
"overMessage"
>
<
Row
className
=
"overMessage"
>
{
/* status graph */
}
{
/* status graph */
}
<
Col
span
=
{
9
}
className
=
"prograph overviewBoder"
>
<
Col
span
=
{
9
}
className
=
"prograph overviewBoder
cc
"
>
<
Title1
text
=
"Status"
icon
=
"5.png"
/>
<
Title1
text
=
"Status"
icon
=
"5.png"
/>
<
Progressed
<
Progressed
trialNumber
=
{
trialNumber
}
trialNumber
=
{
trialNumber
}
...
@@ -459,13 +482,13 @@ class Overview extends React.Component<{}, OverviewState> {
...
@@ -459,13 +482,13 @@ class Overview extends React.Component<{}, OverviewState> {
/>
/>
</
Col
>
</
Col
>
{
/* experiment parameters search space tuner assessor... */
}
{
/* experiment parameters search space tuner assessor... */
}
<
Col
span
=
{
7
}
className
=
"overviewBoder"
>
<
Col
span
=
{
7
}
className
=
"overviewBoder
cc
"
>
<
Title1
text
=
"Search space"
icon
=
"10.png"
/>
<
Title1
text
=
"Search space"
icon
=
"10.png"
/>
<
Row
className
=
"experiment"
>
<
Row
className
=
"experiment"
>
<
SearchSpace
searchSpace
=
{
searchSpace
}
/>
<
SearchSpace
searchSpace
=
{
searchSpace
}
/>
</
Row
>
</
Row
>
</
Col
>
</
Col
>
<
Col
span
=
{
8
}
className
=
"overviewBoder"
>
<
Col
span
=
{
8
}
className
=
"overviewBoder
cc
"
>
<
Title1
text
=
"Profile"
icon
=
"4.png"
/>
<
Title1
text
=
"Profile"
icon
=
"4.png"
/>
<
Row
className
=
"experiment"
>
<
Row
className
=
"experiment"
>
{
/* the scroll bar all the trial profile in the searchSpace div*/
}
{
/* the scroll bar all the trial profile in the searchSpace div*/
}
...
...
src/webui/src/components/SlideBar.tsx
View file @
ba8dccd6
import
*
as
React
from
'
react
'
;
import
*
as
React
from
'
react
'
;
import
{
Link
}
from
'
react-router
'
;
import
{
Link
}
from
'
react-router
'
;
import
axios
from
'
axios
'
;
import
axios
from
'
axios
'
;
import
{
DOWNLOAD_IP
}
from
'
../static/const
'
;
import
{
Row
,
Col
,
Menu
,
Dropdown
,
Icon
}
from
'
antd
'
;
import
{
MANAGER_IP
}
from
'
../static/const
'
;
import
{
MANAGER_IP
}
from
'
../static/const
'
;
import
MediaQuery
from
'
react-responsive
'
;
import
{
DOWNLOAD_IP
}
from
'
../static/const
'
;
import
{
Row
,
Col
,
Menu
,
Dropdown
,
Icon
,
Select
}
from
'
antd
'
;
const
{
SubMenu
}
=
Menu
;
const
{
Option
}
=
Select
;
import
'
../static/style/slideBar.scss
'
;
import
'
../static/style/slideBar.scss
'
;
import
'
../static/style/button.scss
'
;
import
'
../static/style/button.scss
'
;
interface
SliderState
{
interface
SliderState
{
version
:
string
;
version
:
string
;
menuVisible
:
boolean
;
menuVisible
:
boolean
;
navBarVisible
:
boolean
;
}
interface
SliderProps
{
changeInterval
:
(
value
:
number
)
=>
void
;
changeFresh
:
(
value
:
string
)
=>
void
;
}
}
interface
EventPer
{
interface
EventPer
{
key
:
string
;
key
:
string
;
}
}
class
SlideBar
extends
React
.
Component
<
{},
SliderState
>
{
class
SlideBar
extends
React
.
Component
<
SliderProps
,
SliderState
>
{
public
_isMounted
=
false
;
public
_isMounted
=
false
;
public
divMenu
:
HTMLDivElement
|
null
;
constructor
(
props
:
{})
{
public
countOfMenu
:
number
=
0
;
super
(
props
);
public
selectHTML
:
Select
|
null
;
this
.
state
=
{
version
:
''
,
constructor
(
props
:
SliderProps
)
{
menuVisible
:
false
super
(
props
);
};
this
.
state
=
{
}
version
:
''
,
menuVisible
:
false
,
downExperimentContent
=
()
=>
{
navBarVisible
:
false
,
axios
};
.
all
([
}
axios
.
get
(
`
${
MANAGER_IP
}
/experiment`
),
axios
.
get
(
`
${
MANAGER_IP
}
/trial-jobs`
),
downExperimentContent
=
()
=>
{
axios
.
get
(
`
${
MANAGER_IP
}
/metric-data`
)
axios
])
.
all
([
.
then
(
axios
.
spread
((
res
,
res1
,
res2
)
=>
{
axios
.
get
(
`
${
MANAGER_IP
}
/experiment`
),
if
(
res
.
status
===
200
&&
res1
.
status
===
200
&&
res2
.
status
===
200
)
{
axios
.
get
(
`
${
MANAGER_IP
}
/trial-jobs`
),
if
(
res
.
data
.
params
.
searchSpace
)
{
axios
.
get
(
`
${
MANAGER_IP
}
/metric-data`
)
res
.
data
.
params
.
searchSpace
=
JSON
.
parse
(
res
.
data
.
params
.
searchSpace
);
])
}
.
then
(
axios
.
spread
((
res
,
res1
,
res2
)
=>
{
const
isEdge
=
navigator
.
userAgent
.
indexOf
(
'
Edge
'
)
!==
-
1
?
true
:
false
;
if
(
res
.
status
===
200
&&
res1
.
status
===
200
&&
res2
.
status
===
200
)
{
let
trialMessagesArr
=
res1
.
data
;
if
(
res
.
data
.
params
.
searchSpace
)
{
const
interResultList
=
res2
.
data
;
res
.
data
.
params
.
searchSpace
=
JSON
.
parse
(
res
.
data
.
params
.
searchSpace
);
Object
.
keys
(
trialMessagesArr
).
map
(
item
=>
{
}
// transform hyperparameters as object to show elegantly
const
isEdge
=
navigator
.
userAgent
.
indexOf
(
'
Edge
'
)
!==
-
1
?
true
:
false
;
trialMessagesArr
[
item
].
hyperParameters
=
JSON
.
parse
(
trialMessagesArr
[
item
].
hyperParameters
);
let
trialMessagesArr
=
res1
.
data
;
const
trialId
=
trialMessagesArr
[
item
].
id
;
const
interResultList
=
res2
.
data
;
// add intermediate result message
Object
.
keys
(
trialMessagesArr
).
map
(
item
=>
{
trialMessagesArr
[
item
].
intermediate
=
[];
// transform hyperparameters as object to show elegantly
Object
.
keys
(
interResultList
).
map
(
key
=>
{
trialMessagesArr
[
item
].
hyperParameters
=
JSON
.
parse
(
trialMessagesArr
[
item
].
hyperParameters
);
const
interId
=
interResultList
[
key
].
trialJobId
;
const
trialId
=
trialMessagesArr
[
item
].
id
;
if
(
trialId
===
interId
)
{
// add intermediate result message
trialMessagesArr
[
item
].
intermediate
.
push
(
interResultList
[
key
]);
trialMessagesArr
[
item
].
intermediate
=
[];
}
Object
.
keys
(
interResultList
).
map
(
key
=>
{
const
interId
=
interResultList
[
key
].
trialJobId
;
if
(
trialId
===
interId
)
{
trialMessagesArr
[
item
].
intermediate
.
push
(
interResultList
[
key
]);
}
});
});
const
result
=
{
experimentParameters
:
res
.
data
,
trialMessage
:
trialMessagesArr
};
const
aTag
=
document
.
createElement
(
'
a
'
);
const
file
=
new
Blob
([
JSON
.
stringify
(
result
,
null
,
4
)],
{
type
:
'
application/json
'
});
aTag
.
download
=
'
experiment.json
'
;
aTag
.
href
=
URL
.
createObjectURL
(
file
);
aTag
.
click
();
if
(
!
isEdge
)
{
URL
.
revokeObjectURL
(
aTag
.
href
);
}
if
(
navigator
.
userAgent
.
indexOf
(
'
Firefox
'
)
>
-
1
)
{
const
downTag
=
document
.
createElement
(
'
a
'
);
downTag
.
addEventListener
(
'
click
'
,
function
()
{
downTag
.
download
=
'
experiment.json
'
;
downTag
.
href
=
URL
.
createObjectURL
(
file
);
});
let
eventMouse
=
document
.
createEvent
(
'
MouseEvents
'
);
eventMouse
.
initEvent
(
'
click
'
,
false
,
false
);
downTag
.
dispatchEvent
(
eventMouse
);
}
}
}));
}
downnnimanagerLog
=
()
=>
{
axios
(
`
${
DOWNLOAD_IP
}
/nnimanager.log`
,
{
method
:
'
GET
'
})
.
then
(
res
=>
{
if
(
res
.
status
===
200
)
{
const
nniLogfile
=
res
.
data
;
const
aTag
=
document
.
createElement
(
'
a
'
);
const
isEdge
=
navigator
.
userAgent
.
indexOf
(
'
Edge
'
)
!==
-
1
?
true
:
false
;
const
file
=
new
Blob
([
nniLogfile
],
{
type
:
'
application/json
'
});
aTag
.
download
=
'
nnimanagerLog.log
'
;
aTag
.
href
=
URL
.
createObjectURL
(
file
);
aTag
.
click
();
if
(
!
isEdge
)
{
URL
.
revokeObjectURL
(
aTag
.
href
);
}
if
(
navigator
.
userAgent
.
indexOf
(
'
Firefox
'
)
>
-
1
)
{
const
downTag
=
document
.
createElement
(
'
a
'
);
downTag
.
addEventListener
(
'
click
'
,
function
()
{
downTag
.
download
=
'
nnimanagerLog.log
'
;
downTag
.
href
=
URL
.
createObjectURL
(
file
);
});
let
eventMouse
=
document
.
createEvent
(
'
MouseEvents
'
);
eventMouse
.
initEvent
(
'
click
'
,
false
,
false
);
downTag
.
dispatchEvent
(
eventMouse
);
}
}
});
});
});
}
const
result
=
{
experimentParameters
:
res
.
data
,
downDispatcherlog
=
()
=>
{
trialMessage
:
trialMessagesArr
axios
(
`
${
DOWNLOAD_IP
}
/dispatcher.log`
,
{
};
method
:
'
GET
'
const
aTag
=
document
.
createElement
(
'
a
'
);
})
const
file
=
new
Blob
([
JSON
.
stringify
(
result
,
null
,
4
)],
{
type
:
'
application/json
'
});
.
then
(
res
=>
{
aTag
.
download
=
'
experiment.json
'
;
if
(
res
.
status
===
200
)
{
aTag
.
href
=
URL
.
createObjectURL
(
file
);
const
dispatchLogfile
=
res
.
data
;
aTag
.
click
();
const
aTag
=
document
.
createElement
(
'
a
'
);
if
(
!
isEdge
)
{
const
isEdge
=
navigator
.
userAgent
.
indexOf
(
'
Edge
'
)
!==
-
1
?
true
:
false
;
URL
.
revokeObjectURL
(
aTag
.
href
);
const
file
=
new
Blob
([
dispatchLogfile
],
{
type
:
'
application/json
'
});
}
aTag
.
download
=
'
dispatcherLog.log
'
;
if
(
navigator
.
userAgent
.
indexOf
(
'
Firefox
'
)
>
-
1
)
{
aTag
.
href
=
URL
.
createObjectURL
(
file
);
const
downTag
=
document
.
createElement
(
'
a
'
);
aTag
.
click
();
downTag
.
addEventListener
(
'
click
'
,
function
()
{
if
(
!
isEdge
)
{
downTag
.
download
=
'
experiment.json
'
;
URL
.
revokeObjectURL
(
aTag
.
href
);
downTag
.
href
=
URL
.
createObjectURL
(
file
);
}
if
(
navigator
.
userAgent
.
indexOf
(
'
Firefox
'
)
>
-
1
)
{
const
downTag
=
document
.
createElement
(
'
a
'
);
downTag
.
addEventListener
(
'
click
'
,
function
()
{
downTag
.
download
=
'
dispatcherLog.log
'
;
downTag
.
href
=
URL
.
createObjectURL
(
file
);
});
let
eventMouse
=
document
.
createEvent
(
'
MouseEvents
'
);
eventMouse
.
initEvent
(
'
click
'
,
false
,
false
);
downTag
.
dispatchEvent
(
eventMouse
);
}
}
});
});
let
eventMouse
=
document
.
createEvent
(
'
MouseEvents
'
);
}
eventMouse
.
initEvent
(
'
click
'
,
false
,
false
);
downTag
.
dispatchEvent
(
eventMouse
);
getNNIversion
=
()
=>
{
}
axios
(
`
${
MANAGER_IP
}
/version`
,
{
}
method
:
'
GET
'
}));
})
}
.
then
(
res
=>
{
if
(
res
.
status
===
200
&&
this
.
_isMounted
)
{
downnnimanagerLog
=
()
=>
{
this
.
setState
({
version
:
res
.
data
});
axios
(
`
${
DOWNLOAD_IP
}
/nnimanager.log`
,
{
}
method
:
'
GET
'
})
.
then
(
res
=>
{
if
(
res
.
status
===
200
)
{
const
nniLogfile
=
res
.
data
;
const
aTag
=
document
.
createElement
(
'
a
'
);
const
isEdge
=
navigator
.
userAgent
.
indexOf
(
'
Edge
'
)
!==
-
1
?
true
:
false
;
const
file
=
new
Blob
([
nniLogfile
],
{
type
:
'
application/json
'
});
aTag
.
download
=
'
nnimanager.log
'
;
aTag
.
href
=
URL
.
createObjectURL
(
file
);
aTag
.
click
();
if
(
!
isEdge
)
{
URL
.
revokeObjectURL
(
aTag
.
href
);
}
if
(
navigator
.
userAgent
.
indexOf
(
'
Firefox
'
)
>
-
1
)
{
const
downTag
=
document
.
createElement
(
'
a
'
);
downTag
.
addEventListener
(
'
click
'
,
function
()
{
downTag
.
download
=
'
nnimanager.log
'
;
downTag
.
href
=
URL
.
createObjectURL
(
file
);
});
});
let
eventMouse
=
document
.
createEvent
(
'
MouseEvents
'
);
}
eventMouse
.
initEvent
(
'
click
'
,
false
,
false
);
downTag
.
dispatchEvent
(
eventMouse
);
handleMenuClick
=
(
e
:
EventPer
)
=>
{
}
if
(
this
.
_isMounted
)
{
this
.
setState
({
menuVisible
:
false
});
}
switch
(
e
.
key
)
{
// download experiment related content
case
'
1
'
:
this
.
downExperimentContent
();
break
;
// download nnimanager log file
case
'
2
'
:
this
.
downnnimanagerLog
();
break
;
// download dispatcher log file
case
'
3
'
:
this
.
downDispatcherlog
();
break
;
case
'
close
'
:
case
'
10
'
:
case
'
20
'
:
case
'
30
'
:
case
'
60
'
:
this
.
getInterval
(
e
.
key
);
break
;
default
:
}
}
});
}
}
handleVisibleChange
=
(
flag
:
boolean
)
=>
{
downDispatcherlog
=
()
=>
{
if
(
this
.
_isMounted
===
true
)
{
axios
(
`
${
DOWNLOAD_IP
}
/dispatcher.log`
,
{
this
.
setState
({
menuVisible
:
flag
});
method
:
'
GET
'
})
.
then
(
res
=>
{
if
(
res
.
status
===
200
)
{
const
dispatchLogfile
=
res
.
data
;
const
aTag
=
document
.
createElement
(
'
a
'
);
const
isEdge
=
navigator
.
userAgent
.
indexOf
(
'
Edge
'
)
!==
-
1
?
true
:
false
;
const
file
=
new
Blob
([
dispatchLogfile
],
{
type
:
'
application/json
'
});
aTag
.
download
=
'
dispatcher.log
'
;
aTag
.
href
=
URL
.
createObjectURL
(
file
);
aTag
.
click
();
if
(
!
isEdge
)
{
URL
.
revokeObjectURL
(
aTag
.
href
);
}
if
(
navigator
.
userAgent
.
indexOf
(
'
Firefox
'
)
>
-
1
)
{
const
downTag
=
document
.
createElement
(
'
a
'
);
downTag
.
addEventListener
(
'
click
'
,
function
()
{
downTag
.
download
=
'
dispatcher.log
'
;
downTag
.
href
=
URL
.
createObjectURL
(
file
);
});
let
eventMouse
=
document
.
createEvent
(
'
MouseEvents
'
);
eventMouse
.
initEvent
(
'
click
'
,
false
,
false
);
downTag
.
dispatchEvent
(
eventMouse
);
}
}
}
});
}
}
getInterval
=
(
value
:
string
)
=>
{
getNNIversion
=
()
=>
{
axios
(
`
${
MANAGER_IP
}
/version`
,
{
if
(
value
===
'
close
'
)
{
method
:
'
GET
'
this
.
props
.
changeInterval
(
0
);
})
}
else
{
.
then
(
res
=>
{
this
.
props
.
changeInterval
(
parseInt
(
value
,
10
));
if
(
res
.
status
===
200
&&
this
.
_isMounted
)
{
}
this
.
setState
({
version
:
res
.
data
});
}
menu
=
()
=>
{
this
.
countOfMenu
=
0
;
return
(
<
Menu
onClick
=
{
this
.
handleMenuClick
}
>
<
Menu
.
Item
key
=
"1"
>
Experiment Parameters
</
Menu
.
Item
>
<
Menu
.
Item
key
=
"2"
>
NNImanager Logfile
</
Menu
.
Item
>
<
Menu
.
Item
key
=
"3"
>
Dispatcher Logfile
</
Menu
.
Item
>
</
Menu
>
);
}
// nav bar
navigationBar
=
()
=>
{
const
{
version
}
=
this
.
state
;
const
feedBackLink
=
`https://github.com/Microsoft/nni/issues/new?labels=
${
version
}
`
;
return
(
<
Menu
onClick
=
{
this
.
handleMenuClick
}
mode
=
"inline"
>
<
Menu
.
Item
key
=
"overview"
><
Link
to
=
{
'
/oview
'
}
>
Overview
</
Link
></
Menu
.
Item
>
<
Menu
.
Item
key
=
"detail"
><
Link
to
=
{
'
/detail
'
}
>
Trials detail
</
Link
></
Menu
.
Item
>
<
Menu
.
Item
key
=
"fresh"
>
<
span
className
=
"fresh"
onClick
=
{
this
.
fresh
}
><
span
>
Fresh
</
span
></
span
>
</
Menu
.
Item
>
<
Menu
.
Item
key
=
"feedback"
>
<
a
href
=
{
feedBackLink
}
target
=
"_blank"
>
Feedback
</
a
>
</
Menu
.
Item
>
<
Menu
.
Item
key
=
"version"
>
Version:
{
version
}
</
Menu
.
Item
>
<
SubMenu
key
=
"download"
onChange
=
{
this
.
handleVisibleChange
}
title
=
{
<
span
>
<
span
>
Download
</
span
>
</
span
>
}
>
<
Menu
.
Item
key
=
"1"
>
Experiment Parameters
</
Menu
.
Item
>
<
Menu
.
Item
key
=
"2"
>
NNImanager Logfile
</
Menu
.
Item
>
<
Menu
.
Item
key
=
"3"
>
Dispatcher Logfile
</
Menu
.
Item
>
</
SubMenu
>
</
Menu
>
);
}
// nav bar <1299
showMenu
=
()
=>
{
if
(
this
.
divMenu
!==
null
)
{
this
.
countOfMenu
=
this
.
countOfMenu
+
1
;
if
(
this
.
countOfMenu
%
2
===
0
)
{
this
.
divMenu
.
setAttribute
(
'
class
'
,
'
hide
'
);
}
else
{
this
.
divMenu
.
setAttribute
(
'
class
'
,
'
show
'
);
}
}
}
});
}
}
select
=
()
=>
{
handleMenuClick
=
(
e
:
EventPer
)
=>
{
return
(
if
(
this
.
_isMounted
)
{
this
.
setState
({
menuVisible
:
false
});
}
<
Select
// download experiment related content
onSelect
=
{
this
.
getInterval
}
switch
(
e
.
key
)
{
defaultValue
=
"Refresh every 10s"
case
'
1
'
:
className
=
"interval"
this
.
downExperimentContent
();
>
break
;
<
Option
value
=
"close"
>
Disable Auto Refresh
</
Option
>
case
'
2
'
:
<
Option
value
=
"10"
>
Refresh every 10s
</
Option
>
this
.
downnnimanagerLog
();
<
Option
value
=
"20"
>
Refresh every 20s
</
Option
>
break
;
<
Option
value
=
"30"
>
Refresh every 30s
</
Option
>
case
'
3
'
:
<
Option
value
=
"60"
>
Refresh every 1min
</
Option
>
this
.
downDispatcherlog
();
</
Select
>
break
;
);
default
:
}
}
}
fresh
=
(
event
:
React
.
SyntheticEvent
<
EventTarget
>
)
=>
{
event
.
preventDefault
();
handleVisibleChange
=
(
flag
:
boolean
)
=>
{
const
whichPage
=
window
.
location
.
pathname
;
this
.
setState
({
menuVisible
:
flag
});
this
.
props
.
changeFresh
(
whichPage
);
}
}
componentDidMount
()
{
componentDidMount
()
{
this
.
_isMounted
=
true
;
this
.
_isMounted
=
true
;
this
.
getNNIversion
();
this
.
getNNIversion
();
}
}
componentWillUnmount
()
{
componentWillUnmount
()
{
this
.
_isMounted
=
false
;
this
.
_isMounted
=
false
;
}
}
render
()
{
render
()
{
const
{
version
,
menuVisible
}
=
this
.
state
;
const
{
version
,
menuVisible
}
=
this
.
state
;
const
feed
=
`https://github.com/Microsoft/nni/issues/new?labels=
${
version
}
`
;
const
feed
=
`https://github.com/Microsoft/nni/issues/new?labels=
${
version
}
`
;
const
menu
=
(
return
(
<
Menu
onClick
=
{
this
.
handleMenuClick
}
>
<
Row
>
<
Menu
.
Item
key
=
"1"
>
Experiment Parameters
</
Menu
.
Item
>
<
MediaQuery
query
=
"(min-width: 1299px)"
>
<
Menu
.
Item
key
=
"2"
>
NNImanager Logfile
</
Menu
.
Item
>
<
Row
className
=
"nav"
>
<
Menu
.
Item
key
=
"3"
>
Dispatcher Logfile
</
Menu
.
Item
>
<
ul
className
=
"link"
>
</
Menu
>
<
li
className
=
"logo"
>
);
<
Link
to
=
{
'
/oview
'
}
>
return
(
<
img
<
Row
className
=
"nav"
>
src
=
{
require
(
'
../static/img/logo2.png
'
)
}
<
Col
span
=
{
8
}
>
style
=
{
{
width
:
88
}
}
<
ul
className
=
"link"
>
alt
=
"NNI logo"
<
li
className
=
"logo"
>
/>
<
Link
to
=
{
'
/oview
'
}
>
</
Link
>
<
img
src
=
{
require
(
'
../static/img/logo2.png
'
)
}
style
=
{
{
width
:
88
}
}
alt
=
"NNI logo"
/>
</
li
>
</
Link
>
<
li
className
=
"tab firstTab"
>
</
li
>
<
Link
to
=
{
'
/oview
'
}
activeClassName
=
"high"
>
<
li
className
=
"tab firstTab"
>
Overview
<
Link
to
=
{
'
/oview
'
}
activeClassName
=
"high"
>
</
Link
>
Overview
</
li
>
</
Link
>
<
li
className
=
"tab"
>
</
li
>
<
Link
to
=
{
'
/detail
'
}
activeClassName
=
"high"
>
<
li
className
=
"tab"
>
Trials detail
<
Link
to
=
{
'
/detail
'
}
activeClassName
=
"high"
>
</
Link
>
Trials detail
</
li
>
</
Link
>
<
li
className
=
"feedback"
>
</
li
>
<
span
className
=
"fresh"
onClick
=
{
this
.
fresh
}
>
</
ul
>
<
Icon
type
=
"sync"
/><
span
>
Fresh
</
span
>
</
Col
>
</
span
>
<
Col
span
=
{
16
}
className
=
"feedback"
>
<
Dropdown
<
Dropdown
className
=
"dropdown"
className
=
"dropdown"
overlay
=
{
this
.
menu
()
}
overlay
=
{
menu
}
onVisibleChange
=
{
this
.
handleVisibleChange
}
onVisibleChange
=
{
this
.
handleVisibleChange
}
visible
=
{
menuVisible
}
visible
=
{
menuVisible
}
trigger
=
{
[
'
click
'
]
}
>
>
<
a
className
=
"ant-dropdown-link"
href
=
"#"
>
<
a
className
=
"ant-dropdown-link"
href
=
"#"
>
Download
<
Icon
type
=
"down"
/>
Download
<
Icon
type
=
"down"
/>
</
a
>
</
a
>
</
Dropdown
>
</
Dropdown
>
<
a
href
=
{
feed
}
target
=
"_blank"
>
<
a
href
=
{
feed
}
target
=
"_blank"
>
<
img
<
img
src
=
{
require
(
'
../static/img/icon/issue.png
'
)
}
src
=
{
require
(
'
../static/img/icon/issue.png
'
)
}
alt
=
"NNI github issue"
alt
=
"NNI github issue"
/>
/>
Feedback
Feedback
</
a
>
</
a
>
<
span
className
=
"version"
>
Version:
{
version
}
</
span
>
<
span
className
=
"version"
>
Version:
{
version
}
</
span
>
</
Col
>
</
li
>
</
Row
>
</
ul
>
);
</
Row
>
}
</
MediaQuery
>
<
MediaQuery
query
=
"(max-width: 1299px)"
>
<
Row
className
=
"little"
>
<
Col
span
=
{
6
}
className
=
"menu"
>
<
Icon
type
=
"unordered-list"
className
=
"more"
onClick
=
{
this
.
showMenu
}
/>
<
div
ref
=
{
div
=>
this
.
divMenu
=
div
}
className
=
"hide"
>
{
this
.
navigationBar
()
}
</
div
>
</
Col
>
<
Col
span
=
{
10
}
className
=
"logo"
>
<
Link
to
=
{
'
/oview
'
}
>
<
img
src
=
{
require
(
'
../static/img/logo2.png
'
)
}
style
=
{
{
width
:
88
}
}
alt
=
"NNI logo"
/>
</
Link
>
</
Col
>
</
Row
>
</
MediaQuery
>
{
this
.
select
()
}
</
Row
>
);
}
}
}
export
default
SlideBar
;
export
default
SlideBar
;
\ No newline at end of file
src/webui/src/components/TrialsDetail.tsx
View file @
ba8dccd6
...
@@ -33,7 +33,12 @@ interface TrialDetailState {
...
@@ -33,7 +33,12 @@ interface TrialDetailState {
intermediateCounts
:
number
;
intermediateCounts
:
number
;
}
}
class
TrialsDetail
extends
React
.
Component
<
{},
TrialDetailState
>
{
interface
TrialsDetailProps
{
interval
:
number
;
whichPageToFresh
:
string
;
}
class
TrialsDetail
extends
React
.
Component
<
TrialsDetailProps
,
TrialDetailState
>
{
public
_isMounted
=
false
;
public
_isMounted
=
false
;
public
interAccuracy
=
0
;
public
interAccuracy
=
0
;
...
@@ -61,7 +66,7 @@ class TrialsDetail extends React.Component<{}, TrialDetailState> {
...
@@ -61,7 +66,7 @@ class TrialsDetail extends React.Component<{}, TrialDetailState> {
</
div
>
</
div
>
);
);
constructor
(
props
:
{}
)
{
constructor
(
props
:
TrialsDetailProps
)
{
super
(
props
);
super
(
props
);
this
.
state
=
{
this
.
state
=
{
...
@@ -139,7 +144,7 @@ class TrialsDetail extends React.Component<{}, TrialDetailState> {
...
@@ -139,7 +144,7 @@ class TrialsDetail extends React.Component<{}, TrialDetailState> {
const
items
=
metricSource
[
key
];
const
items
=
metricSource
[
key
];
if
(
items
.
trialJobId
===
id
)
{
if
(
items
.
trialJobId
===
id
)
{
// succeed trial, last intermediate result is final result
// succeed trial, last intermediate result is final result
// final result format may be object
// final result format may be object
if
(
typeof
JSON
.
parse
(
items
.
data
)
===
'
object
'
)
{
if
(
typeof
JSON
.
parse
(
items
.
data
)
===
'
object
'
)
{
mediate
.
push
(
JSON
.
parse
(
items
.
data
).
default
);
mediate
.
push
(
JSON
.
parse
(
items
.
data
).
default
);
}
else
{
}
else
{
...
@@ -227,21 +232,24 @@ class TrialsDetail extends React.Component<{}, TrialDetailState> {
...
@@ -227,21 +232,24 @@ class TrialsDetail extends React.Component<{}, TrialDetailState> {
// close timer
// close timer
isOffIntervals
=
()
=>
{
isOffIntervals
=
()
=>
{
axios
(
`
${
MANAGER_IP
}
/check-status`
,
{
const
{
interval
}
=
this
.
props
;
method
:
'
GET
'
if
(
interval
===
0
)
{
})
window
.
clearInterval
(
this
.
interTableList
);
.
then
(
res
=>
{
return
;
if
(
res
.
status
===
200
&&
this
.
_isMounted
)
{
}
else
{
switch
(
res
.
data
.
status
)
{
axios
(
`
${
MANAGER_IP
}
/check-status`
,
{
case
'
DONE
'
:
method
:
'
GET
'
case
'
ERROR
'
:
})
case
'
STOPPED
'
:
.
then
(
res
=>
{
if
(
res
.
status
===
200
&&
this
.
_isMounted
)
{
const
expStatus
=
res
.
data
.
status
;
if
(
expStatus
===
'
DONE
'
||
expStatus
===
'
ERROR
'
||
expStatus
===
'
STOPPED
'
)
{
window
.
clearInterval
(
this
.
interTableList
);
window
.
clearInterval
(
this
.
interTableList
);
b
re
ak
;
re
turn
;
default
:
}
}
}
}
}
);
});
}
}
}
handleEntriesSelect
=
(
value
:
string
)
=>
{
handleEntriesSelect
=
(
value
:
string
)
=>
{
...
@@ -304,11 +312,23 @@ class TrialsDetail extends React.Component<{}, TrialDetailState> {
...
@@ -304,11 +312,23 @@ class TrialsDetail extends React.Component<{}, TrialDetailState> {
});
});
}
}
componentWillReceiveProps
(
nextProps
:
TrialsDetailProps
)
{
const
{
interval
,
whichPageToFresh
}
=
nextProps
;
window
.
clearInterval
(
this
.
interTableList
);
if
(
interval
!==
0
)
{
this
.
interTableList
=
window
.
setInterval
(
this
.
getDetailSource
,
interval
*
1000
);
}
if
(
whichPageToFresh
.
includes
(
'
/detail
'
))
{
this
.
getDetailSource
();
}
}
componentDidMount
()
{
componentDidMount
()
{
this
.
_isMounted
=
true
;
this
.
_isMounted
=
true
;
const
{
interval
}
=
this
.
props
;
this
.
getDetailSource
();
this
.
getDetailSource
();
this
.
interTableList
=
window
.
setInterval
(
this
.
getDetailSource
,
1
0
000
);
this
.
interTableList
=
window
.
setInterval
(
this
.
getDetailSource
,
interval
*
1000
);
this
.
checkExperimentPlatform
();
this
.
checkExperimentPlatform
();
}
}
...
@@ -329,7 +349,6 @@ class TrialsDetail extends React.Component<{}, TrialDetailState> {
...
@@ -329,7 +349,6 @@ class TrialsDetail extends React.Component<{}, TrialDetailState> {
<
div
>
<
div
>
<
div
className
=
"trial"
id
=
"tabsty"
>
<
div
className
=
"trial"
id
=
"tabsty"
>
<
Tabs
type
=
"card"
onChange
=
{
this
.
handleWhichTabs
}
>
<
Tabs
type
=
"card"
onChange
=
{
this
.
handleWhichTabs
}
>
{
/* <TabPane tab={this.titleOfacc} key="1" destroyInactiveTabPane={true}> */
}
<
TabPane
tab
=
{
this
.
titleOfacc
}
key
=
"1"
>
<
TabPane
tab
=
{
this
.
titleOfacc
}
key
=
"1"
>
<
Row
className
=
"graph"
>
<
Row
className
=
"graph"
>
<
DefaultPoint
<
DefaultPoint
...
@@ -350,7 +369,6 @@ class TrialsDetail extends React.Component<{}, TrialDetailState> {
...
@@ -350,7 +369,6 @@ class TrialsDetail extends React.Component<{}, TrialDetailState> {
</
TabPane
>
</
TabPane
>
<
TabPane
tab
=
{
this
.
titleOfDuration
}
key
=
"3"
>
<
TabPane
tab
=
{
this
.
titleOfDuration
}
key
=
"3"
>
<
Duration
source
=
{
source
}
whichGraph
=
{
whichGraph
}
/>
<
Duration
source
=
{
source
}
whichGraph
=
{
whichGraph
}
/>
{
/* <Duration source={source} whichGraph={whichGraph} clickCounts={durationCounts} /> */
}
</
TabPane
>
</
TabPane
>
<
TabPane
tab
=
{
this
.
titleOfIntermediate
}
key
=
"4"
>
<
TabPane
tab
=
{
this
.
titleOfIntermediate
}
key
=
"4"
>
<
Intermediate
source
=
{
source
}
whichGraph
=
{
whichGraph
}
/>
<
Intermediate
source
=
{
source
}
whichGraph
=
{
whichGraph
}
/>
...
...
src/webui/src/components/overview/Progress.tsx
View file @
ba8dccd6
...
@@ -78,7 +78,7 @@ class Progressed extends React.Component<ProgressProps, ProgressState> {
...
@@ -78,7 +78,7 @@ class Progressed extends React.Component<ProgressProps, ProgressState> {
}).
then
(
res
=>
{
}).
then
(
res
=>
{
if
(
res
.
status
===
200
)
{
if
(
res
.
status
===
200
)
{
message
.
destroy
();
message
.
destroy
();
message
.
success
(
`Update
${
CONTROLTYPE
[
1
].
toLocaleLowerCase
()}
message
.
success
(
`Update
${
CONTROLTYPE
[
1
].
toLocaleLowerCase
()}
successfully`
);
successfully`
);
// rerender trial profile message
// rerender trial profile message
const
{
updateFile
}
=
this
.
props
;
const
{
updateFile
}
=
this
.
props
;
...
...
src/webui/src/components/overview/SuccessTable.tsx
View file @
ba8dccd6
...
@@ -72,8 +72,15 @@ class SuccessTable extends React.Component<SuccessTableProps, {}> {
...
@@ -72,8 +72,15 @@ class SuccessTable extends React.Component<SuccessTableProps, {}> {
sorter
:
(
a
:
TableObj
,
b
:
TableObj
)
=>
(
a
.
duration
as
number
)
-
(
b
.
duration
as
number
),
sorter
:
(
a
:
TableObj
,
b
:
TableObj
)
=>
(
a
.
duration
as
number
)
-
(
b
.
duration
as
number
),
render
:
(
text
:
string
,
record
:
TableObj
)
=>
{
render
:
(
text
:
string
,
record
:
TableObj
)
=>
{
let
duration
;
let
duration
;
if
(
record
.
duration
)
{
if
(
record
.
duration
!==
undefined
)
{
duration
=
convertDuration
(
record
.
duration
);
// duration is nagative number(-1) & 0-1
if
(
record
.
duration
>
0
&&
record
.
duration
<
1
||
record
.
duration
<
0
)
{
duration
=
`
${
record
.
duration
}
s`
;
}
else
{
duration
=
convertDuration
(
record
.
duration
);
}
}
else
{
duration
=
0
;
}
}
return
(
return
(
<
div
className
=
"durationsty"
><
div
>
{
duration
}
</
div
></
div
>
<
div
className
=
"durationsty"
><
div
>
{
duration
}
</
div
></
div
>
...
...
src/webui/src/components/public-child/TrialLog.tsx
View file @
ba8dccd6
...
@@ -15,7 +15,7 @@ class TrialLog extends React.Component<TrialLogProps, {}> {
...
@@ -15,7 +15,7 @@ class TrialLog extends React.Component<TrialLogProps, {}> {
render
()
{
render
()
{
const
{
logStr
}
=
this
.
props
;
const
{
logStr
}
=
this
.
props
;
return
(
return
(
<
div
>
<
div
>
<
LogPathChild
<
LogPathChild
...
...
src/webui/src/components/trial-detail/TableList.tsx
View file @
ba8dccd6
...
@@ -264,7 +264,8 @@ class TableList extends React.Component<TableListProps, TableListState> {
...
@@ -264,7 +264,8 @@ class TableList extends React.Component<TableListProps, TableListState> {
render
:
(
text
:
string
,
record
:
TableObj
)
=>
{
render
:
(
text
:
string
,
record
:
TableObj
)
=>
{
let
duration
;
let
duration
;
if
(
record
.
duration
!==
undefined
)
{
if
(
record
.
duration
!==
undefined
)
{
if
(
record
.
duration
>
0
&&
record
.
duration
<
1
)
{
// duration is nagative number(-1) & 0-1
if
(
record
.
duration
>
0
&&
record
.
duration
<
1
||
record
.
duration
<
0
)
{
duration
=
`
${
record
.
duration
}
s`
;
duration
=
`
${
record
.
duration
}
s`
;
}
else
{
}
else
{
duration
=
convertDuration
(
record
.
duration
);
duration
=
convertDuration
(
record
.
duration
);
...
...
src/webui/src/index.css
View file @
ba8dccd6
...
@@ -49,8 +49,8 @@ table {
...
@@ -49,8 +49,8 @@ table {
border-collapse
:
collapse
;
border-collapse
:
collapse
;
border-spacing
:
0
;
border-spacing
:
0
;
}
}
@font-face
{
@font-face
{
font-family
:
'Segoe'
;
font-family
:
'Segoe'
;
src
:
url('./static/font/SegoePro-Regular.ttf')
;
src
:
url('./static/font/SegoePro-Regular.ttf')
;
}
}
src/webui/src/static/function.ts
View file @
ba8dccd6
...
@@ -50,7 +50,7 @@ const getFinalResult = (final: Array<FinalResult>) => {
...
@@ -50,7 +50,7 @@ const getFinalResult = (final: Array<FinalResult>) => {
}
}
};
};
// get final result value // acc obj
// get final result value // acc obj
const
getFinal
=
(
final
:
Array
<
FinalResult
>
)
=>
{
const
getFinal
=
(
final
:
Array
<
FinalResult
>
)
=>
{
let
showDefault
:
FinalType
;
let
showDefault
:
FinalType
;
if
(
final
)
{
if
(
final
)
{
...
...
src/webui/src/static/interface.ts
View file @
ba8dccd6
...
@@ -109,7 +109,7 @@ interface FinalResult {
...
@@ -109,7 +109,7 @@ interface FinalResult {
}
}
export
{
export
{
TableObj
,
Parameters
,
Experiment
,
TableObj
,
Parameters
,
Experiment
,
AccurPoint
,
TrialNumber
,
TrialJob
,
AccurPoint
,
TrialNumber
,
TrialJob
,
DetailAccurPoint
,
TooltipForAccuracy
,
DetailAccurPoint
,
TooltipForAccuracy
,
ParaObj
,
Dimobj
,
FinalResult
,
FinalType
,
ParaObj
,
Dimobj
,
FinalResult
,
FinalType
,
...
...
src/webui/src/static/style/openRow.scss
View file @
ba8dccd6
...
@@ -41,7 +41,7 @@ $bgColor: #f2f2f2;
...
@@ -41,7 +41,7 @@ $bgColor: #f2f2f2;
color
:
#212121
;
color
:
#212121
;
background-color
:
#fff
;
background-color
:
#fff
;
cursor
:
pointer
;
cursor
:
pointer
;
border
:
none
;
border
:
none
;
}
}
.logcontent
{
.logcontent
{
height
:
100%
;
height
:
100%
;
...
...
src/webui/src/static/style/overview.scss
View file @
ba8dccd6
...
@@ -5,7 +5,7 @@
...
@@ -5,7 +5,7 @@
}
}
.overGraph
{
.overGraph
{
height
:
362px
;
height
:
362px
;
.accuracy
{
.accuracy
{
width
:
100%
;
width
:
100%
;
height
:
324px
;
height
:
324px
;
...
...
src/webui/src/static/style/overviewTitle.scss
View file @
ba8dccd6
...
@@ -53,7 +53,7 @@ $titleBgcolor: #b3b3b3;
...
@@ -53,7 +53,7 @@ $titleBgcolor: #b3b3b3;
.minTitle
{
.minTitle
{
border-right
:
2px
solid
#fff
;
border-right
:
2px
solid
#fff
;
}
}
.title
:hover
{
.title
:hover
{
cursor
:
pointer
;
cursor
:
pointer
;
}
}
...
...
src/webui/src/static/style/para.scss
View file @
ba8dccd6
.parameter
{
.parameter
{
height
:
100%
;
height
:
100%
;
}
}
.meline
{
.meline
{
...
@@ -15,14 +15,14 @@
...
@@ -15,14 +15,14 @@
.searcHyper
{
.searcHyper
{
position
:
relative
;
position
:
relative
;
margin
:
0
19px
;
margin
:
0
19px
;
.noneData
{
.noneData
{
position
:
absolute
;
position
:
absolute
;
left
:
49%
;
left
:
49%
;
top
:
2
.5%
;
top
:
2
.5%
;
font-size
:
13px
;
font-size
:
13px
;
color
:
#999
;
color
:
#999
;
}
}
}
}
/* Intermediate Result Style */
/* Intermediate Result Style */
...
...
src/webui/src/static/style/progress.scss
View file @
ba8dccd6
...
@@ -26,7 +26,7 @@
...
@@ -26,7 +26,7 @@
border-top-left-radius
:
12px
;
border-top-left-radius
:
12px
;
border-bottom-left-radius
:
12px
;
border-bottom-left-radius
:
12px
;
}
}
.showProgress
{
.showProgress
{
height
:
30px
;
height
:
30px
;
}
}
...
...
src/webui/src/static/style/slideBar.scss
View file @
ba8dccd6
$barHeight
:
56px
;
$barHeight
:
56px
;
/* drowdown and select default bgcolor */
$drowBgColor
:
#f2f2f2
;
/* drowdown and select hover bgcolor */
$drowHoverBgColor
:
#e2e2e2
;
.nav
{
.nav
{
list-style
:
none
;
list-style
:
none
;
width
:
9
4
%
;
width
:
9
5
%
;
height
:
$barHeight
;
height
:
$barHeight
;
margin
:
0
auto
;
margin
:
0
auto
;
position
:
relative
;
.tab
{
.tab
{
font-family
:
'Segoe'
;
font-family
:
'Segoe'
;
line-height
:
$barHeight
;
line-height
:
$barHeight
;
...
@@ -14,7 +19,7 @@ $barHeight: 56px;
...
@@ -14,7 +19,7 @@ $barHeight: 56px;
}
}
}
}
.firstTab
{
.firstTab
{
margin
:
0
3
2px
;
margin
:
0
2
0
px
;
}
}
.logo
{
.logo
{
margin-top
:
2px
;
margin-top
:
2px
;
...
@@ -28,17 +33,26 @@ $barHeight: 56px;
...
@@ -28,17 +33,26 @@ $barHeight: 56px;
}
}
.feedback
{
.feedback
{
text-align
:
right
;
position
:
fixed
;
right
:
19%
;
line-height
:
$barHeight
;
line-height
:
$barHeight
;
font-size
:
16px
;
font-size
:
16px
;
color
:
#fff
;
color
:
#fff
;
.fresh
{
span
{
margin
:
0
10px
0
3px
;
}
}
.fresh
:hover
{
cursor
:
pointer
;
}
a
{
a
{
color
:
#fff
;
color
:
#fff
;
text-decoration
:
none
;
text-decoration
:
none
;
margin-left
:
10px
;
margin-left
:
10px
;
}
}
img
{
img
{
width
:
2
4
px
;
width
:
2
0
px
;
margin-right
:
8px
;
margin-right
:
8px
;
}
}
.version
{
.version
{
...
@@ -51,4 +65,66 @@ $barHeight: 56px;
...
@@ -51,4 +65,66 @@ $barHeight: 56px;
}
}
.dropdown
{
.dropdown
{
margin-right
:
10px
;
margin-right
:
10px
;
}
/* make dropdown content box position in blue bar bottom */
\ No newline at end of file
padding-bottom
:
14px
;
}
.interval
{
position
:
fixed
;
right
:
7%
;
top
:
12px
;
.ant-select-selection
{
background-color
:
transparent
;
border
:
none
;
color
:
#fff
;
outline
:
none
;
font-size
:
16px
;
}
.ant-select-arrow
{
color
:
#fff
;
}
}
/* set select bgcolor */
.ant-select-dropdown-menu
{
background-color
:
$drowBgColor
;
}
.ant-select-dropdown-menu-item
:hover
{
background-color
:
$drowHoverBgColor
;
}
.ant-select-dropdown-menu-item-active
{
background-color
:
transparent
;
}
/* set dropdown bgcolor */
.ant-dropdown
{
.ant-dropdown-menu
{
padding
:
0
;
background-color
:
$drowBgColor
;
border-radius
:
0
;
.ant-dropdown-menu-item
:hover
{
background-color
:
$drowHoverBgColor
;
}
}
}
/* nav style*/
.little
{
width
:
100%
;
.menu
{
.show
{
display
:
block
;
}
.hide
{
display
:
none
;
}
.more
{
color
:
#fff
;
font-size
:
24px
;
margin-top
:
16px
;
}
.more
:hover
{
cursor
:
pointer
;
}
}
.logo
{
text-align
:
center
;
}
}
src/webui/src/static/style/table.scss
View file @
ba8dccd6
...
@@ -27,7 +27,7 @@
...
@@ -27,7 +27,7 @@
/* add the brother selector to increase the priority */
/* add the brother selector to increase the priority */
#succeTable
.commonTableStyle
,
#tableList
.commonTableStyle
{
#succeTable
.commonTableStyle
,
#tableList
.commonTableStyle
{
tr
{
tr
{
text-align
:
center
;
text-align
:
center
;
color
:
#212121
;
color
:
#212121
;
font-family
:
'Segoe'
;
font-family
:
'Segoe'
;
...
@@ -43,14 +43,14 @@
...
@@ -43,14 +43,14 @@
border-bottom
:
1px
solid
#d0d0d0
;
border-bottom
:
1px
solid
#d0d0d0
;
text-align
:
center
;
text-align
:
center
;
}
}
.ant-table-expanded-row
{
.ant-table-expanded-row
{
/* background-color: #f2f2f2 */
/* background-color: #f2f2f2 */
background-color
:
transparent
;
background-color
:
transparent
;
}
}
tr
:hover
{
tr
:hover
{
/* cancel antd table default hover style */
/* cancel antd table default hover style */
td
{
td
{
background-color
:
transparent
;
background-color
:
transparent
;
...
...
test/async_sharing_test/config.yml
View file @
ba8dccd6
...
@@ -4,7 +4,7 @@ trialConcurrency: 3
...
@@ -4,7 +4,7 @@ trialConcurrency: 3
maxExecDuration
:
1h
maxExecDuration
:
1h
maxTrialNum
:
10
maxTrialNum
:
10
#choice: local, remote, pai
#choice: local, remote, pai
trainingServicePlatform
:
remote
trainingServicePlatform
:
remote
#choice: true, false
#choice: true, false
useAnnotation
:
false
useAnnotation
:
false
multiThread
:
true
multiThread
:
true
...
...
Prev
1
…
5
6
7
8
9
10
11
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment