Skip to content

Commit 8f7cd23

Browse files
authored
ITEP-32138 Add dataset size from new training configuration [PART 6] (#505)
1 parent d940252 commit 8f7cd23

File tree

4 files changed

+216
-26
lines changed

4 files changed

+216
-26
lines changed

web_ui/src/pages/project-details/components/project-models/train-model-dialog/advanced-settings/data-management/training-subsets/training-subsets.component.tsx

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,14 @@ import {
1313
} from '../../../../../../../../core/configurable-parameters/services/configuration.interface';
1414
import { Accordion } from '../../ui/accordion/accordion.component';
1515
import { SubsetsDistributionSlider } from './subsets-distribution-slider/subsets-distribution-slider.component';
16+
import { getSubsetsSizes } from './utils';
1617

1718
import styles from './training-subsets.module.scss';
1819

1920
interface SubsetDistributionStatsProps {
20-
trainingCount: number;
21-
validationCount: number;
22-
testCount: number;
21+
trainingSize: number;
22+
validationSize: number;
23+
testSize: number;
2324
}
2425

2526
const Tile: FC<{ color: string }> = ({ color }) => {
@@ -28,43 +29,43 @@ const Tile: FC<{ color: string }> = ({ color }) => {
2829
);
2930
};
3031

31-
const SubsetDistributionStat: FC<{ count: number; color: string; title: string }> = ({ count, color, title }) => {
32+
const SubsetDistributionStat: FC<{ size: number; color: string; title: string }> = ({ size, color, title }) => {
3233
return (
3334
<Flex alignItems={'center'} gap={'size-50'}>
3435
<Tile color={color} />
3536
<Text>
36-
{title}: {count}
37+
{title}: {size}
3738
</Text>
3839
</Flex>
3940
);
4041
};
4142

42-
const SubsetDistributionStats: FC<SubsetDistributionStatsProps> = ({ trainingCount, validationCount, testCount }) => {
43+
const SubsetDistributionStats: FC<SubsetDistributionStatsProps> = ({ trainingSize, validationSize, testSize }) => {
4344
return (
4445
<View gridArea={'counts'} backgroundColor={'static-gray-800'} borderRadius={'small'} padding={'size-100'}>
4546
<Flex alignItems={'center'} justifyContent={'space-between'} UNSAFE_className={styles.statsText}>
4647
<Flex alignItems={'center'} gap={'size-200'}>
47-
<SubsetDistributionStat title={'Training'} color={'var(--training-subset)'} count={trainingCount} />
48+
<SubsetDistributionStat title={'Training'} color={'var(--training-subset)'} size={trainingSize} />
4849
<SubsetDistributionStat
4950
title={'Validation'}
5051
color={'var(--validation-subset)'}
51-
count={validationCount}
52+
size={validationSize}
5253
/>
53-
<SubsetDistributionStat title={'Test'} color={'var(--test-subset)'} count={testCount} />
54+
<SubsetDistributionStat title={'Test'} color={'var(--test-subset)'} size={testSize} />
5455
</Flex>
5556
<Text>
5657
<Text UNSAFE_className={styles.totalStats}>Total: </Text>
57-
{trainingCount + validationCount + testCount} media items
58+
{trainingSize + validationSize + testSize} media items
5859
</Text>
5960
</Flex>
6061
</View>
6162
);
6263
};
6364

6465
interface SubsetsDistributionProps {
65-
trainingSubsetCount: number;
66-
validationSubsetCount: number;
67-
testSubsetCount: number;
66+
trainingSubsetSize: number;
67+
validationSubsetSize: number;
68+
testSubsetSize: number;
6869
subsetsDistribution: number[];
6970
onSubsetsDistributionChange: (values: number[]) => void;
7071
onSubsetsDistributionChangeEnd: (values: number[]) => void;
@@ -73,9 +74,9 @@ interface SubsetsDistributionProps {
7374

7475
const SubsetsDistribution: FC<SubsetsDistributionProps> = ({
7576
subsetsDistribution,
76-
trainingSubsetCount,
77-
testSubsetCount,
78-
validationSubsetCount,
77+
trainingSubsetSize,
78+
testSubsetSize,
79+
validationSubsetSize,
7980
onSubsetsDistributionChange,
8081
onSubsetsDistributionChangeEnd,
8182
onSubsetsDistributionReset,
@@ -114,9 +115,9 @@ const SubsetsDistribution: FC<SubsetsDistributionProps> = ({
114115
<Refresh />
115116
</ActionButton>
116117
<SubsetDistributionStats
117-
testCount={testSubsetCount}
118-
trainingCount={trainingSubsetCount}
119-
validationCount={validationSubsetCount}
118+
testSize={testSubsetSize}
119+
trainingSize={trainingSubsetSize}
120+
validationSize={validationSubsetSize}
120121
/>
121122
</Grid>
122123
</View>
@@ -139,7 +140,6 @@ const VALIDATION_SUBSET_KEY = 'validation';
139140
const TRAINING_SUBSET_KEY = 'training';
140141

141142
const getSubsets = (subsetsConfiguration: SubsetsConfiguration) => {
142-
const testSubset = subsetsConfiguration.find((parameter) => parameter.key === TEST_SUBSET_KEY) as NumberParameter;
143143
const validationSubset = subsetsConfiguration.find(
144144
(parameter) => parameter.key === VALIDATION_SUBSET_KEY
145145
) as NumberParameter;
@@ -150,12 +150,11 @@ const getSubsets = (subsetsConfiguration: SubsetsConfiguration) => {
150150
return {
151151
trainingSubset,
152152
validationSubset,
153-
testSubset,
154153
};
155154
};
156155

157156
export const TrainingSubsets: FC<TrainingSubsetsProps> = ({ subsetsConfiguration, onUpdateTrainingConfiguration }) => {
158-
const { trainingSubset, validationSubset, testSubset } = getSubsets(subsetsConfiguration);
157+
const { trainingSubset, validationSubset } = getSubsets(subsetsConfiguration);
159158

160159
const [subsetsDistribution, setSubsetsDistribution] = useState<number[]>([
161160
trainingSubset.value,
@@ -221,6 +220,12 @@ export const TrainingSubsets: FC<TrainingSubsetsProps> = ({ subsetsConfiguration
221220
});
222221
};
223222

223+
const { trainingSubsetSize, validationSubsetSize, testSubsetSize } = getSubsetsSizes(
224+
subsetsConfiguration,
225+
validationSubsetRatio,
226+
testSubsetRatio
227+
);
228+
224229
return (
225230
<Accordion>
226231
<Accordion.Title>
@@ -239,9 +244,9 @@ export const TrainingSubsets: FC<TrainingSubsetsProps> = ({ subsetsConfiguration
239244
<SubsetsDistribution
240245
subsetsDistribution={subsetsDistribution}
241246
onSubsetsDistributionChange={setSubsetsDistribution}
242-
testSubsetCount={testSubset.value}
243-
trainingSubsetCount={trainingSubset.value}
244-
validationSubsetCount={validationSubset.value}
247+
testSubsetSize={testSubsetSize}
248+
trainingSubsetSize={trainingSubsetSize}
249+
validationSubsetSize={validationSubsetSize}
245250
onSubsetsDistributionChangeEnd={handleUpdateSubsetsConfiguration}
246251
onSubsetsDistributionReset={handleSubsetsConfigurationReset}
247252
/>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
// Copyright (C) 2022-2025 Intel Corporation
2+
// LIMITED EDGE SOFTWARE DISTRIBUTION LICENSE
3+
4+
import { getMockedConfigurationParameter } from '../../../../../../../../test-utils/mocked-items-factory/mocked-configuration-parameters';
5+
import { getSubsetsSizes } from './utils';
6+
7+
describe('getSubsetsSizes', () => {
8+
const datasetSizeParameter = [
9+
getMockedConfigurationParameter({
10+
type: 'int',
11+
value: 101,
12+
key: 'dataset_size',
13+
}),
14+
];
15+
16+
it('calculates subsets sizes for equal distribution', () => {
17+
const validationRatio = 33;
18+
const testRatio = 33;
19+
20+
const result = getSubsetsSizes(datasetSizeParameter, validationRatio, testRatio);
21+
22+
expect(result.trainingSubsetSize).toBe(35);
23+
expect(result.validationSubsetSize).toBe(33);
24+
expect(result.testSubsetSize).toBe(33);
25+
});
26+
27+
it('returns correct sizes for zero validation and test ratios', () => {
28+
const validationRatio = 0;
29+
const testRatio = 0;
30+
31+
const result = getSubsetsSizes(datasetSizeParameter, validationRatio, testRatio);
32+
33+
expect(result.trainingSubsetSize).toBe(101);
34+
expect(result.validationSubsetSize).toBe(0);
35+
expect(result.testSubsetSize).toBe(0);
36+
});
37+
38+
it('handles maximum test ratio correctly', () => {
39+
const validationRatio = 0;
40+
const testRatio = 100;
41+
42+
const result = getSubsetsSizes(datasetSizeParameter, validationRatio, testRatio);
43+
44+
expect(result.trainingSubsetSize).toBe(0);
45+
expect(result.validationSubsetSize).toBe(0);
46+
expect(result.testSubsetSize).toBe(101);
47+
});
48+
49+
it('handles maximum validation ratio correctly', () => {
50+
const validationRatio = 100;
51+
const testRatio = 0;
52+
53+
const result = getSubsetsSizes(datasetSizeParameter, validationRatio, testRatio);
54+
55+
expect(result.trainingSubsetSize).toBe(0);
56+
expect(result.validationSubsetSize).toBe(101);
57+
expect(result.testSubsetSize).toBe(0);
58+
});
59+
60+
it('returns zero sizes for zero dataset size', () => {
61+
const zeroDatasetParameters = [
62+
getMockedConfigurationParameter({
63+
type: 'int',
64+
value: 0,
65+
key: 'dataset_size',
66+
}),
67+
];
68+
69+
const validationRatio = 50;
70+
const testRatio = 50;
71+
72+
const result = getSubsetsSizes(zeroDatasetParameters, validationRatio, testRatio);
73+
74+
expect(result.trainingSubsetSize).toBe(0);
75+
expect(result.validationSubsetSize).toBe(0);
76+
expect(result.testSubsetSize).toBe(0);
77+
});
78+
79+
it('returns zero sizes when dataset size parameter is missing', () => {
80+
const validationRatio = 50;
81+
const testRatio = 50;
82+
83+
const result = getSubsetsSizes([], validationRatio, testRatio);
84+
85+
expect(result.trainingSubsetSize).toBe(0);
86+
expect(result.validationSubsetSize).toBe(0);
87+
expect(result.testSubsetSize).toBe(0);
88+
});
89+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright (C) 2022-2025 Intel Corporation
2+
// LIMITED EDGE SOFTWARE DISTRIBUTION LICENSE
3+
4+
import { TrainingConfiguration } from '../../../../../../../../core/configurable-parameters/services/configuration.interface';
5+
import { isNumberParameter } from '../../../../../../../../core/configurable-parameters/utils';
6+
7+
type SubsetSplitParameters = TrainingConfiguration['datasetPreparation']['subsetSplit'];
8+
9+
const getDatasetSize = (subsetSplitParameters: SubsetSplitParameters): number => {
10+
const datasetSize = subsetSplitParameters.find((parameter) => parameter.key === 'dataset_size');
11+
12+
if (isNumberParameter(datasetSize)) {
13+
return datasetSize.value;
14+
}
15+
16+
return 0;
17+
};
18+
19+
export const getSubsetsSizes = (
20+
subsetSplitParameters: SubsetSplitParameters,
21+
validationSubsetRatio: number,
22+
testSubsetRatio: number
23+
) => {
24+
const datasetSize = getDatasetSize(subsetSplitParameters);
25+
26+
const validationSubsetSize = Math.floor(datasetSize * (validationSubsetRatio / 100));
27+
const testSubsetSize = Math.floor(datasetSize * (testSubsetRatio / 100));
28+
const trainingSubsetSize = datasetSize - validationSubsetSize - testSubsetSize;
29+
30+
return {
31+
trainingSubsetSize,
32+
validationSubsetSize,
33+
testSubsetSize,
34+
};
35+
};

web_ui/src/test-utils/mocked-items-factory/mocked-configuration-parameters.ts

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
// Copyright (C) 2022-2025 Intel Corporation
22
// LIMITED EDGE SOFTWARE DISTRIBUTION LICENSE
33

4-
import { ProjectConfiguration } from '../../core/configurable-parameters/services/configuration.interface';
4+
import {
5+
ConfigurationParameter,
6+
ProjectConfiguration,
7+
TrainingConfiguration,
8+
} from '../../core/configurable-parameters/services/configuration.interface';
59

610
export const getMockedProjectConfiguration = (config: Partial<ProjectConfiguration> = {}): ProjectConfiguration => ({
711
taskConfigs: [
@@ -63,3 +67,60 @@ export const getMockedProjectConfiguration = (config: Partial<ProjectConfigurati
6367
],
6468
...config,
6569
});
70+
71+
export const getMockedTrainingConfiguration = (config: Partial<TrainingConfiguration> = {}): TrainingConfiguration => ({
72+
training: [],
73+
datasetPreparation: {
74+
subsetSplit: [],
75+
augmentation: {},
76+
filtering: {},
77+
},
78+
taskId: '',
79+
advancedConfiguration: undefined,
80+
evaluation: [],
81+
...config,
82+
});
83+
84+
export const getMockedConfigurationParameter = (
85+
parameter: Partial<ConfigurationParameter> & Required<Pick<ConfigurationParameter, 'type'>> = {
86+
type: 'float',
87+
}
88+
): ConfigurationParameter => {
89+
if (parameter.type === 'float' || parameter.type === 'int') {
90+
return {
91+
value: 0,
92+
key: 'mocked_parameter',
93+
name: 'Mocked Parameter',
94+
maxValue: 100,
95+
minValue: 0,
96+
description: 'This is a mocked configuration parameter',
97+
defaultValue: 50,
98+
...parameter,
99+
};
100+
}
101+
102+
if (parameter.type === 'bool') {
103+
return {
104+
value: false,
105+
key: 'mocked_bool_parameter',
106+
name: 'Mocked Bool Parameter',
107+
description: 'This is a mocked boolean configuration parameter',
108+
defaultValue: false,
109+
...parameter,
110+
};
111+
}
112+
113+
if (parameter.type === 'enum') {
114+
return {
115+
allowedValues: ['option1', 'option2'],
116+
defaultValue: 'option1',
117+
name: 'Mocked Enum Parameter',
118+
description: 'This is a mocked enum configuration parameter',
119+
value: 'option1',
120+
key: 'mocked_enum_parameter',
121+
...parameter,
122+
};
123+
}
124+
125+
throw new Error(`Unsupported parameter type: ${parameter.type}`);
126+
};

0 commit comments

Comments
 (0)