import * as React from 'react'; import * as copy from 'copy-to-clipboard'; import { Stack, PrimaryButton, Pivot, PivotItem, DefaultButton } from '@fluentui/react'; import JSONTree from 'react-json-tree'; import { Trial } from '@model/trial'; import { MANAGER_IP, RETIARIIPARAMETERS } from '@static/const'; import { EXPERIMENT, TRIALS } from '@static/datamodel'; import { reformatRetiariiParameter } from '@static/function'; import PaiTrialLog from './PaiTrialLog'; import TrialLog from './TrialLog'; import MessageInfo from './MessageInfo'; import PanelMonacoEditor from './PanelMonacoEditor'; import '@style/experiment/overview/overview.scss'; import '@style/openRow.scss'; /** * netron URL must be synchronized with ts/nni_manager/rest_server/index.ts`. * Remember to update it if the value is changed or this file is moved. **/ interface OpenRowProps { trialId: string; } interface OpenRowState { typeInfo: string; info: string; isHidenInfo: boolean; showRetiaParamPanel: boolean; } class OpenRow extends React.Component { constructor(props: OpenRowProps) { super(props); this.state = { typeInfo: '', info: '', isHidenInfo: true, showRetiaParamPanel: false }; } hideMessageInfo = (): void => { this.setState(() => ({ isHidenInfo: true })); }; hideRetiaParam = (): void => { this.setState(() => ({ showRetiaParamPanel: false })); }; isshowRetiaParamPanel = (): void => { this.setState(() => ({ showRetiaParamPanel: true })); }; /** * info: message content * typeInfo: message type: success | error... * continuousTime: show time, 2000ms */ getCopyStatus = (info: string, typeInfo: string): void => { this.setState(() => ({ info, typeInfo, isHidenInfo: false })); setTimeout(this.hideMessageInfo, 2000); }; copyParams = (trial: Trial): void => { // get copy parameters const params = JSON.stringify(reformatRetiariiParameter(trial.description.parameters as any), null, 4); if (copy.default(params)) { this.getCopyStatus('Success copy parameters to clipboard in form of python dict !', 'success'); } else { this.getCopyStatus('Failed !', 'error'); } }; openTrialLog = (filename: string): void => { window.open(`${MANAGER_IP}/trial-file/${this.props.trialId}/${filename}`); }; openModelOnnx = (): void => { // TODO: netron might need prefix. window.open(`/netron/index.html?url=${MANAGER_IP}/trial-file/${this.props.trialId}/model.onnx`); }; render(): React.ReactNode { const { isHidenInfo, typeInfo, info, showRetiaParamPanel } = this.state; const trialId = this.props.trialId; const trial = TRIALS.getTrial(trialId); const logPathRow = trial.info.logPath || "This trial's log path is not available."; const originParameters = trial.description.parameters; const hasVisualHyperParams = RETIARIIPARAMETERS in originParameters; return ( {trial.info.hyperParameters !== undefined ? ( true} // default expandNode getItemString={(): null => null} // remove the {} items data={reformatRetiariiParameter(originParameters as any)} /> {hasVisualHyperParams && ( )} {/* copy success | failed message info */} {!isHidenInfo && } {showRetiaParamPanel && ( )} ) : ( Error: {`This trial's parameters are not available.'`} )} { // FIXME: this should not be handled in web UI side EXPERIMENT.trainingServicePlatform !== 'local' ? ( ) : (
{/* view each trial log in drawer*/}
) }
{EXPERIMENT.metadata.tag.includes('retiarii') ? (
Visualize models with 3rd-party tools.
) : null}
); } } export default OpenRow;