diff --git a/ts/webui/src/components/modals/Compare.tsx b/ts/webui/src/components/modals/Compare.tsx index 4c49a85de8..ab059fe1b2 100644 --- a/ts/webui/src/components/modals/Compare.tsx +++ b/ts/webui/src/components/modals/Compare.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { renderToString } from 'react-dom/server'; -import { Stack, Modal, IconButton, IDragOptions, ContextualMenu } from '@fluentui/react'; +import { Stack, Modal, IconButton, IDragOptions, ContextualMenu, Dropdown, IDropdownOption } from '@fluentui/react'; import ReactEcharts from 'echarts-for-react'; import { TooltipForIntermediate, TableObj, SingleAxis } from '../../static/interface'; import { contentStyles, iconButtonStyles } from '../buttons/ModalTheme'; @@ -8,6 +8,11 @@ import { convertDuration, parseMetrics } from '../../static/function'; import { EXPERIMENT, TRIALS } from '../../static/datamodel'; import '../../static/style/compare.scss'; +/*** + * Compare file is design for [each trial intermediate result and trials compare function] + * if trial has dict intermediate result, graph support shows all keys that type is number + */ + function _getWebUIWidth(): number { return window.innerWidth; } @@ -20,7 +25,7 @@ const dragOptions: IDragOptions = { // TODO: this should be refactored to the common modules // copied from trial.ts -function _parseIntermediates(trial: TableObj): number[] { +function _parseIntermediates(trial: TableObj, key: string): number[] { const intermediates: number[] = []; for (const metric of trial.intermediates) { if (metric === undefined) { @@ -29,7 +34,7 @@ function _parseIntermediates(trial: TableObj): number[] { const parsedMetric = parseMetrics(metric.data); if (typeof parsedMetric === 'object') { // TODO: should handle more types of metric keys - intermediates.push(parsedMetric.default); + intermediates.push(parsedMetric[key]); } else { intermediates.push(parsedMetric); } @@ -54,9 +59,17 @@ interface CompareProps { changeSelectTrialIds?: () => void; } -class Compare extends React.Component { +interface CompareState { + intermediateKey: string; // default, dict other keys +} + +class Compare extends React.Component { constructor(props: CompareProps) { super(props); + + this.state = { + intermediateKey: 'default' + }; } private _generateTooltipSummary = (row: Item, value: string): string => @@ -206,8 +219,17 @@ class Compare extends React.Component { onHideDialog(); }; + private selectOtherKeys = (_event: React.FormEvent, item?: IDropdownOption): void => { + if (item !== undefined) { + this.setState(() => ({ intermediateKey: item.text })); + } + }; + render(): React.ReactNode { const { trials, title, showDetails } = this.props; + const { intermediateKey } = this.state; + let intermediateAllKeysList: string[] = []; + const flatten = (m: Map): Map => { return new Map(Array.from(m).map(([key, value]) => [key.baseName, value])); }; @@ -218,9 +240,23 @@ class Compare extends React.Component { duration: convertDuration(trial.duration), parameters: flatten(trial.parameters(inferredSearchSpace)), metrics: flatten(trial.metrics(TRIALS.inferredMetricSpace())), - intermediates: _parseIntermediates(trial) + intermediates: _parseIntermediates(trial, intermediateKey) })); + if (trials[0].intermediates !== undefined && trials[0].intermediates[0]) { + const parsedMetric = parseMetrics(trials[0].intermediates[0].data); + if (parsedMetric !== undefined && typeof parsedMetric === 'object') { + const allIntermediateKeys: string[] = []; + // just add type=number keys + for (const key in parsedMetric) { + if (typeof parsedMetric[key] === 'number') { + allIntermediateKeys.push(key); + } + } + intermediateAllKeysList = allIntermediateKeys; + } + } + return ( { onClick={this.closeCompareModal} /> + {intermediateAllKeysList.length > 1 ? ( + + ({ + key: key, + text: intermediateAllKeysList[item] + }))} + onChange={this.selectOtherKeys} + /> + + ) : null} {this._intermediates(items)} # Intermediate result diff --git a/ts/webui/src/static/style/search.scss b/ts/webui/src/static/style/search.scss index 9ad10b3473..b4dfc0dd56 100644 --- a/ts/webui/src/static/style/search.scss +++ b/ts/webui/src/static/style/search.scss @@ -20,7 +20,8 @@ .selectKeys { /* intermediate result is dict, select box for keys */ .select { - margin-right: 12%; + margin-right: 6%; + margin-bottom: 15px; } .ms-Dropdown {