import TableColTitle from '@/components/TableColTitle'; import TrialStatusCell from '@/pages/HyperParameter/components/TrialStatusCell'; import { HyperParameterTrial } from '@/pages/HyperParameter/types'; import { getExpMetricsReq } from '@/services/hyperParameter'; import { to } from '@/utils/promise'; import SessionStorage from '@/utils/sessionStorage'; import tableCellRender, { TableCellValueType } from '@/utils/table'; import { useNavigate } from '@umijs/max'; import { App, Button, Table, type TableProps } from 'antd'; import classNames from 'classnames'; import { useEffect, useState } from 'react'; import TrialFileTree from '../TrialFileTree'; import styles from './index.less'; type ExperimentHistoryProps = { trialList?: HyperParameterTrial[]; }; function ExperimentHistory({ trialList = [] }: ExperimentHistoryProps) { const [expandedRowKeys, setExpandedRowKeys] = useState([]); const [selectedRowKeys, setSelectedRowKeys] = useState([]); const { message } = App.useApp(); const [tableData, setTableData] = useState([]); const [loading, setLoading] = useState(false); // 防止 Tabs 卡顿 useEffect(() => { setLoading(true); setTimeout(() => { setTableData(trialList); setLoading(false); }, 500); }, [trialList]); // 计算 column const first: HyperParameterTrial | undefined = trialList ? trialList[0] : undefined; const config: Record = first?.config ?? {}; const metricAnalysis: Record = first?.metric_analysis ?? {}; const paramsNames = Object.keys(config); const metricNames = Object.keys(metricAnalysis); const navigate = useNavigate(); const trialColumns: TableProps['columns'] = [ { title: '序号', dataIndex: 'index', key: 'index', width: 100, fixed: 'left', render: (_text, record, index: number) => { return (
{index + 1} {record.is_best && 最佳}
); }, }, { title: '基本信息', align: 'center', children: [ { title: '运行次数', dataIndex: 'training_iteration', key: 'training_iteration', width: 120, fixed: 'left', render: tableCellRender(false), }, { title: '平均时长(秒)', dataIndex: 'time_avg', key: 'time_avg', width: 150, fixed: 'left', render: tableCellRender(false, TableCellValueType.Custom, { format: (value = 0) => Number(value).toFixed(2), }), }, { title: '状态', dataIndex: 'status', key: 'status', width: 120, fixed: 'left', render: TrialStatusCell, }, ], }, ]; if (paramsNames.length) { trialColumns.push({ title: '运行参数', dataIndex: 'config', key: 'config', align: 'center', children: paramsNames.map((name) => ({ title: , dataIndex: ['config', name], key: name, width: 120, align: 'center', render: tableCellRender(true), })), }); } if (metricNames.length) { trialColumns.push({ title: `指标分析(${first?.metric ?? ''})`, dataIndex: 'metrics', key: 'metrics', align: 'center', children: metricNames.map((name) => ({ title: , dataIndex: ['metric_analysis', name], key: name, width: 120, align: 'center', render: tableCellRender(true), })), }); } // 自定义展开视图 const expandedRowRender = (record: HyperParameterTrial) => { return ; }; // 展开实例 const handleExpandChange = (expanded: boolean, record: HyperParameterTrial) => { if (expanded) { setExpandedRowKeys([record.trial_id]); } else { setExpandedRowKeys([]); } }; // 选择行 const rowSelection: TableProps['rowSelection'] = { type: 'checkbox', columnWidth: 48, fixed: 'left', selectedRowKeys, onChange: (selectedRowKeys: React.Key[]) => { setSelectedRowKeys(selectedRowKeys); }, }; // 对比 const handleComparisonClick = () => { if (selectedRowKeys.length < 1) { message.error('请至少选择一项'); return; } getExpMetrics(); }; // 获取对比 url const getExpMetrics = async () => { const [res] = await to(getExpMetricsReq(selectedRowKeys)); if (res && res.data) { const url = res.data; SessionStorage.setItem(SessionStorage.aimUrlKey, url); navigate('compare-visual'); } }; return (
(record.is_best ? styles['table-best-row'] : '')} dataSource={tableData} columns={trialColumns} pagination={false} bordered={true} scroll={{ y: 'calc(100% - 110px)', x: '100%' }} rowKey="trial_id" expandable={{ expandedRowRender: expandedRowRender, onExpand: handleExpandChange, expandedRowKeys: expandedRowKeys, rowExpandable: (record: HyperParameterTrial) => !!record.file, }} rowSelection={rowSelection} /> ); } export default ExperimentHistory;