| @@ -153,6 +153,7 @@ function ActiveLearnInstance() { | |||||
| className={styles['active-learn-instance__basic']} | className={styles['active-learn-instance__basic']} | ||||
| info={experimentInfo} | info={experimentInfo} | ||||
| runStatus={workflowStatus} | runStatus={workflowStatus} | ||||
| instanceStatus={instanceInfo?.status} | |||||
| isInstance | isInstance | ||||
| /> | /> | ||||
| ), | ), | ||||
| @@ -1,6 +1,5 @@ | |||||
| import ConfigInfo, { type BasicInfoData } from '@/components/ConfigInfo'; | import ConfigInfo, { type BasicInfoData } from '@/components/ConfigInfo'; | ||||
| import RunDuration from '@/components/RunDuration'; | |||||
| import { AutoMLTaskType, autoMLTaskTypeOptions } from '@/enums'; | |||||
| import { AutoMLTaskType, autoMLTaskTypeOptions, ExperimentStatus } from '@/enums'; | |||||
| import { useComputingResource } from '@/hooks/useComputingResource'; | import { useComputingResource } from '@/hooks/useComputingResource'; | ||||
| import { | import { | ||||
| classifierAlgorithms, | classifierAlgorithms, | ||||
| @@ -10,7 +9,7 @@ import { | |||||
| regressorAlgorithms, | regressorAlgorithms, | ||||
| } from '@/pages/ActiveLearn/components/CreateForm/utils'; | } from '@/pages/ActiveLearn/components/CreateForm/utils'; | ||||
| import { ActiveLearnData } from '@/pages/ActiveLearn/types'; | import { ActiveLearnData } from '@/pages/ActiveLearn/types'; | ||||
| import { experimentStatusInfo } from '@/pages/Experiment/status'; | |||||
| import ExperimentRunBasic from '@/pages/AutoML/components/ExperimentRunBasic'; | |||||
| import { type NodeStatus } from '@/types'; | import { type NodeStatus } from '@/types'; | ||||
| import { | import { | ||||
| formatBoolean, | formatBoolean, | ||||
| @@ -21,7 +20,6 @@ import { | |||||
| formatMirror, | formatMirror, | ||||
| formatModel, | formatModel, | ||||
| } from '@/utils/format'; | } from '@/utils/format'; | ||||
| import { Flex } from 'antd'; | |||||
| import classNames from 'classnames'; | import classNames from 'classnames'; | ||||
| import { useMemo } from 'react'; | import { useMemo } from 'react'; | ||||
| import styles from './index.less'; | import styles from './index.less'; | ||||
| @@ -31,9 +29,16 @@ type BasicInfoProps = { | |||||
| className?: string; | className?: string; | ||||
| isInstance?: boolean; | isInstance?: boolean; | ||||
| runStatus?: NodeStatus; | runStatus?: NodeStatus; | ||||
| instanceStatus?: ExperimentStatus; | |||||
| }; | }; | ||||
| function BasicInfo({ info, className, runStatus, isInstance = false }: BasicInfoProps) { | |||||
| function BasicInfo({ | |||||
| info, | |||||
| className, | |||||
| runStatus, | |||||
| instanceStatus, | |||||
| isInstance = false, | |||||
| }: BasicInfoProps) { | |||||
| const getResourceDescription = useComputingResource()[1]; | const getResourceDescription = useComputingResource()[1]; | ||||
| const basicDatas: BasicInfoData[] = useMemo(() => { | const basicDatas: BasicInfoData[] = useMemo(() => { | ||||
| if (!info) { | if (!info) { | ||||
| @@ -205,53 +210,13 @@ function BasicInfo({ info, className, runStatus, isInstance = false }: BasicInfo | |||||
| ]; | ]; | ||||
| }, [info, getResourceDescription]); | }, [info, getResourceDescription]); | ||||
| const instanceDatas = useMemo(() => { | |||||
| if (!info || !runStatus) { | |||||
| return []; | |||||
| } | |||||
| return [ | |||||
| { | |||||
| label: '启动时间', | |||||
| value: formatDate(info.create_time), | |||||
| }, | |||||
| { | |||||
| label: '执行时长', | |||||
| value: <RunDuration createTime={info.create_time} finishTime={runStatus.finishedAt} />, | |||||
| }, | |||||
| { | |||||
| label: '状态', | |||||
| value: ( | |||||
| <Flex align="center"> | |||||
| <img | |||||
| style={{ width: '17px', marginRight: '7px' }} | |||||
| src={experimentStatusInfo[runStatus.phase]?.icon} | |||||
| draggable={false} | |||||
| alt="" | |||||
| /> | |||||
| <div | |||||
| style={{ | |||||
| color: experimentStatusInfo[runStatus?.phase]?.color, | |||||
| fontSize: '15px', | |||||
| lineHeight: 1.6, | |||||
| }} | |||||
| > | |||||
| {experimentStatusInfo[runStatus?.phase]?.label} | |||||
| </div> | |||||
| </Flex> | |||||
| ), | |||||
| }, | |||||
| ]; | |||||
| }, [runStatus, info]); | |||||
| return ( | return ( | ||||
| <div className={classNames(styles['active-learn-basic'], className)}> | <div className={classNames(styles['active-learn-basic'], className)}> | ||||
| {isInstance && runStatus && ( | {isInstance && runStatus && ( | ||||
| <ConfigInfo | |||||
| title="运行信息" | |||||
| datas={instanceDatas} | |||||
| labelWidth={70} | |||||
| style={{ marginBottom: '20px' }} | |||||
| <ExperimentRunBasic | |||||
| create_time={info?.create_time} | |||||
| runStatus={runStatus} | |||||
| instanceStatus={instanceStatus} | |||||
| /> | /> | ||||
| )} | )} | ||||
| {!isInstance && ( | {!isInstance && ( | ||||
| @@ -156,6 +156,7 @@ function AutoMLInstance() { | |||||
| className={styles['auto-ml-instance__basic']} | className={styles['auto-ml-instance__basic']} | ||||
| info={autoMLInfo} | info={autoMLInfo} | ||||
| runStatus={workflowStatus} | runStatus={workflowStatus} | ||||
| instanceStatus={instanceInfo?.status} | |||||
| isInstance | isInstance | ||||
| /> | /> | ||||
| ), | ), | ||||
| @@ -1,20 +1,19 @@ | |||||
| import ConfigInfo, { type BasicInfoData } from '@/components/ConfigInfo'; | import ConfigInfo, { type BasicInfoData } from '@/components/ConfigInfo'; | ||||
| import RunDuration from '@/components/RunDuration'; | |||||
| import { | import { | ||||
| AutoMLTaskType, | AutoMLTaskType, | ||||
| AutoMLType, | AutoMLType, | ||||
| ExperimentStatus, | |||||
| autoMLEnsembleClassOptions, | autoMLEnsembleClassOptions, | ||||
| autoMLTaskTypeOptions, | autoMLTaskTypeOptions, | ||||
| } from '@/enums'; | } from '@/enums'; | ||||
| import { useComputingResource } from '@/hooks/useComputingResource'; | import { useComputingResource } from '@/hooks/useComputingResource'; | ||||
| import { AutoMLData } from '@/pages/AutoML/types'; | import { AutoMLData } from '@/pages/AutoML/types'; | ||||
| import { experimentStatusInfo } from '@/pages/Experiment/status'; | |||||
| import { type NodeStatus } from '@/types'; | import { type NodeStatus } from '@/types'; | ||||
| import { parseJsonText } from '@/utils'; | import { parseJsonText } from '@/utils'; | ||||
| import { formatBoolean, formatDataset, formatDate, formatEnum } from '@/utils/format'; | import { formatBoolean, formatDataset, formatDate, formatEnum } from '@/utils/format'; | ||||
| import { Flex } from 'antd'; | |||||
| import classNames from 'classnames'; | import classNames from 'classnames'; | ||||
| import { useMemo } from 'react'; | import { useMemo } from 'react'; | ||||
| import ExperimentRunBasic from '../ExperimentRunBasic'; | |||||
| import styles from './index.less'; | import styles from './index.less'; | ||||
| // 格式化优化方向 | // 格式化优化方向 | ||||
| @@ -40,9 +39,16 @@ type AutoMLBasicProps = { | |||||
| className?: string; | className?: string; | ||||
| isInstance?: boolean; | isInstance?: boolean; | ||||
| runStatus?: NodeStatus; | runStatus?: NodeStatus; | ||||
| instanceStatus?: ExperimentStatus; | |||||
| }; | }; | ||||
| function AutoMLBasic({ info, className, runStatus, isInstance = false }: AutoMLBasicProps) { | |||||
| function AutoMLBasic({ | |||||
| info, | |||||
| className, | |||||
| runStatus, | |||||
| instanceStatus, | |||||
| isInstance = false, | |||||
| }: AutoMLBasicProps) { | |||||
| const getResourceDescription = useComputingResource()[1]; | const getResourceDescription = useComputingResource()[1]; | ||||
| const basicDatas: BasicInfoData[] = useMemo(() => { | const basicDatas: BasicInfoData[] = useMemo(() => { | ||||
| if (!info) { | if (!info) { | ||||
| @@ -284,53 +290,13 @@ function AutoMLBasic({ info, className, runStatus, isInstance = false }: AutoMLB | |||||
| ]; | ]; | ||||
| }, [info]); | }, [info]); | ||||
| const instanceDatas = useMemo(() => { | |||||
| if (!info || !runStatus) { | |||||
| return []; | |||||
| } | |||||
| return [ | |||||
| { | |||||
| label: '启动时间', | |||||
| value: formatDate(info.create_time), | |||||
| }, | |||||
| { | |||||
| label: '执行时长', | |||||
| value: <RunDuration createTime={info.create_time} finishTime={runStatus.finishedAt} />, | |||||
| }, | |||||
| { | |||||
| label: '状态', | |||||
| value: ( | |||||
| <Flex align="center"> | |||||
| <img | |||||
| style={{ width: '17px', marginRight: '7px' }} | |||||
| src={experimentStatusInfo[runStatus.phase]?.icon} | |||||
| draggable={false} | |||||
| alt="" | |||||
| /> | |||||
| <div | |||||
| style={{ | |||||
| color: experimentStatusInfo[runStatus?.phase]?.color, | |||||
| fontSize: '15px', | |||||
| lineHeight: 1.6, | |||||
| }} | |||||
| > | |||||
| {experimentStatusInfo[runStatus?.phase]?.label} | |||||
| </div> | |||||
| </Flex> | |||||
| ), | |||||
| }, | |||||
| ]; | |||||
| }, [runStatus, info]); | |||||
| return ( | return ( | ||||
| <div className={classNames(styles['auto-ml-basic'], className)}> | <div className={classNames(styles['auto-ml-basic'], className)}> | ||||
| {isInstance && runStatus && ( | {isInstance && runStatus && ( | ||||
| <ConfigInfo | |||||
| title="运行信息" | |||||
| datas={instanceDatas} | |||||
| labelWidth={70} | |||||
| style={{ marginBottom: '20px' }} | |||||
| <ExperimentRunBasic | |||||
| create_time={info?.create_time} | |||||
| runStatus={runStatus} | |||||
| instanceStatus={instanceStatus} | |||||
| /> | /> | ||||
| )} | )} | ||||
| {!isInstance && ( | {!isInstance && ( | ||||
| @@ -8,6 +8,7 @@ import KFIcon from '@/components/KFIcon'; | |||||
| import PageTitle from '@/components/PageTitle'; | import PageTitle from '@/components/PageTitle'; | ||||
| import { ExperimentStatus, autoMLTypeOptions } from '@/enums'; | import { ExperimentStatus, autoMLTypeOptions } from '@/enums'; | ||||
| import { useCacheState } from '@/hooks/useCacheState'; | import { useCacheState } from '@/hooks/useCacheState'; | ||||
| import { useServerTime } from '@/hooks/useServerTime'; | |||||
| import { AutoMLData } from '@/pages/AutoML/types'; | import { AutoMLData } from '@/pages/AutoML/types'; | ||||
| import { experimentStatusInfo } from '@/pages/Experiment/status'; | import { experimentStatusInfo } from '@/pages/Experiment/status'; | ||||
| import themes from '@/styles/theme.less'; | import themes from '@/styles/theme.less'; | ||||
| @@ -51,6 +52,7 @@ function ExperimentList({ type }: ExperimentListProps) { | |||||
| const [experimentInsList, setExperimentInsList] = useState<ExperimentInstanceData[]>([]); | const [experimentInsList, setExperimentInsList] = useState<ExperimentInstanceData[]>([]); | ||||
| const [expandedRowKeys, setExpandedRowKeys] = useState<number[]>([]); | const [expandedRowKeys, setExpandedRowKeys] = useState<number[]>([]); | ||||
| const [experimentInsTotal, setExperimentInsTotal] = useState(0); | const [experimentInsTotal, setExperimentInsTotal] = useState(0); | ||||
| const [now] = useServerTime(); | |||||
| const [pagination, setPagination] = useState<TablePaginationConfig>( | const [pagination, setPagination] = useState<TablePaginationConfig>( | ||||
| cacheState?.pagination ?? { | cacheState?.pagination ?? { | ||||
| current: 1, | current: 1, | ||||
| @@ -275,6 +277,7 @@ function ExperimentList({ type }: ExperimentListProps) { | |||||
| return { | return { | ||||
| ...item, | ...item, | ||||
| status: ExperimentStatus.Terminated, | status: ExperimentStatus.Terminated, | ||||
| finish_time: now().toISOString(), | |||||
| }; | }; | ||||
| } | } | ||||
| return item; | return item; | ||||
| @@ -0,0 +1,70 @@ | |||||
| import ConfigInfo from '@/components/ConfigInfo'; | |||||
| import RunDuration from '@/components/RunDuration'; | |||||
| import { ExperimentStatus } from '@/enums'; | |||||
| import { experimentStatusInfo } from '@/pages/Experiment/status'; | |||||
| import { type NodeStatus } from '@/types'; | |||||
| import { formatDate } from '@/utils/format'; | |||||
| import { Flex } from 'antd'; | |||||
| import { useMemo } from 'react'; | |||||
| type ExperimentRunBasicProps = { | |||||
| create_time?: string; | |||||
| runStatus?: NodeStatus; | |||||
| instanceStatus?: ExperimentStatus; | |||||
| }; | |||||
| function ExperimentRunBasic({ create_time, runStatus, instanceStatus }: ExperimentRunBasicProps) { | |||||
| const instanceDatas = useMemo(() => { | |||||
| if (!runStatus) { | |||||
| return []; | |||||
| } | |||||
| const status = | |||||
| instanceStatus === ExperimentStatus.Terminated ? instanceStatus : runStatus.phase; | |||||
| const statusInfo = experimentStatusInfo[status]; | |||||
| return [ | |||||
| { | |||||
| label: '启动时间', | |||||
| value: formatDate(create_time), | |||||
| }, | |||||
| { | |||||
| label: '执行时长', | |||||
| value: <RunDuration createTime={create_time} finishTime={runStatus.finishedAt} />, | |||||
| }, | |||||
| { | |||||
| label: '状态', | |||||
| value: ( | |||||
| <Flex align="center"> | |||||
| <img | |||||
| style={{ width: '17px', marginRight: '7px' }} | |||||
| src={statusInfo?.icon} | |||||
| draggable={false} | |||||
| alt="" | |||||
| /> | |||||
| <div | |||||
| style={{ | |||||
| color: statusInfo?.color, | |||||
| fontSize: '15px', | |||||
| lineHeight: 1.6, | |||||
| }} | |||||
| > | |||||
| {statusInfo?.label} | |||||
| </div> | |||||
| </Flex> | |||||
| ), | |||||
| }, | |||||
| ]; | |||||
| }, [runStatus, create_time, instanceStatus]); | |||||
| return ( | |||||
| <ConfigInfo | |||||
| title="运行信息" | |||||
| datas={instanceDatas} | |||||
| labelWidth={70} | |||||
| style={{ marginBottom: '20px' }} | |||||
| /> | |||||
| ); | |||||
| } | |||||
| export default ExperimentRunBasic; | |||||
| @@ -55,9 +55,7 @@ | |||||
| } | } | ||||
| &__time { | &__time { | ||||
| display: flex; | display: flex; | ||||
| flex: 0 1 content; | |||||
| align-items: center; | align-items: center; | ||||
| width: 100%; | |||||
| color: #808080; | color: #808080; | ||||
| font-size: 13px; | font-size: 13px; | ||||
| } | } | ||||
| @@ -28,6 +28,7 @@ import AddExperimentModal from './components/AddExperimentModal'; | |||||
| import ExperimentInstanceList from './components/ExperimentInstanceList'; | import ExperimentInstanceList from './components/ExperimentInstanceList'; | ||||
| import styles from './index.less'; | import styles from './index.less'; | ||||
| import { experimentStatusInfo } from './status'; | import { experimentStatusInfo } from './status'; | ||||
| import { useServerTime } from '@/hooks/useServerTime'; | |||||
| // 定时器 | // 定时器 | ||||
| const timerIds = new Map(); | const timerIds = new Map(); | ||||
| @@ -47,6 +48,7 @@ function Experiment() { | |||||
| const [cacheState, setCacheState] = useCacheState(); | const [cacheState, setCacheState] = useCacheState(); | ||||
| const [searchText, setSearchText] = useState(cacheState?.searchText); | const [searchText, setSearchText] = useState(cacheState?.searchText); | ||||
| const [inputText, setInputText] = useState(cacheState?.searchText); | const [inputText, setInputText] = useState(cacheState?.searchText); | ||||
| const [now] = useServerTime(); | |||||
| const [pagination, setPagination] = useState( | const [pagination, setPagination] = useState( | ||||
| cacheState?.pagination ?? { | cacheState?.pagination ?? { | ||||
| current: 1, | current: 1, | ||||
| @@ -384,6 +386,7 @@ function Experiment() { | |||||
| return { | return { | ||||
| ...item, | ...item, | ||||
| status: ExperimentStatus.Terminated, | status: ExperimentStatus.Terminated, | ||||
| finish_time: now().toISOString(), | |||||
| }; | }; | ||||
| } | } | ||||
| return item; | return item; | ||||
| @@ -168,6 +168,7 @@ function HyperParameterInstance() { | |||||
| className={styles['hyper-parameter-instance__basic']} | className={styles['hyper-parameter-instance__basic']} | ||||
| info={experimentInfo} | info={experimentInfo} | ||||
| runStatus={workflowStatus} | runStatus={workflowStatus} | ||||
| instanceStatus={instanceInfo?.status} | |||||
| isInstance | isInstance | ||||
| /> | /> | ||||
| ), | ), | ||||
| @@ -1,7 +1,8 @@ | |||||
| import ConfigInfo, { type BasicInfoData } from '@/components/ConfigInfo'; | import ConfigInfo, { type BasicInfoData } from '@/components/ConfigInfo'; | ||||
| import RunDuration from '@/components/RunDuration'; | import RunDuration from '@/components/RunDuration'; | ||||
| import { hyperParameterOptimizedMode } from '@/enums'; | |||||
| import { ExperimentStatus, hyperParameterOptimizedMode } from '@/enums'; | |||||
| import { useComputingResource } from '@/hooks/useComputingResource'; | import { useComputingResource } from '@/hooks/useComputingResource'; | ||||
| import ExperimentRunBasic from '@/pages/AutoML/components/ExperimentRunBasic'; | |||||
| import { experimentStatusInfo } from '@/pages/Experiment/status'; | import { experimentStatusInfo } from '@/pages/Experiment/status'; | ||||
| import { | import { | ||||
| schedulerAlgorithms, | schedulerAlgorithms, | ||||
| @@ -33,12 +34,14 @@ type HyperParameterBasicProps = { | |||||
| className?: string; | className?: string; | ||||
| isInstance?: boolean; | isInstance?: boolean; | ||||
| runStatus?: NodeStatus; | runStatus?: NodeStatus; | ||||
| instanceStatus?: ExperimentStatus; | |||||
| }; | }; | ||||
| function HyperParameterBasic({ | function HyperParameterBasic({ | ||||
| info, | info, | ||||
| className, | className, | ||||
| runStatus, | runStatus, | ||||
| instanceStatus, | |||||
| isInstance = false, | isInstance = false, | ||||
| }: HyperParameterBasicProps) { | }: HyperParameterBasicProps) { | ||||
| const getResourceDescription = useComputingResource()[1]; | const getResourceDescription = useComputingResource()[1]; | ||||
| @@ -187,11 +190,10 @@ function HyperParameterBasic({ | |||||
| return ( | return ( | ||||
| <div className={classNames(styles['hyper-parameter-basic'], className)}> | <div className={classNames(styles['hyper-parameter-basic'], className)}> | ||||
| {isInstance && runStatus && ( | {isInstance && runStatus && ( | ||||
| <ConfigInfo | |||||
| title="运行信息" | |||||
| datas={instanceDatas} | |||||
| labelWidth={70} | |||||
| style={{ marginBottom: '20px' }} | |||||
| <ExperimentRunBasic | |||||
| create_time={info?.create_time} | |||||
| runStatus={runStatus} | |||||
| instanceStatus={instanceStatus} | |||||
| /> | /> | ||||
| )} | )} | ||||
| {!isInstance && ( | {!isInstance && ( | ||||