11// Copyright (C) 2022-2025 Intel Corporation
22// LIMITED EDGE SOFTWARE DISTRIBUTION LICENSE
33
4- import { FC , useRef , useState } from 'react' ;
4+ import { FC , useState } from 'react' ;
55
66import { Content , Flex , Grid , Heading , InlineAlert , minmax , Text , View } from '@geti/ui' ;
77import { isEqual } from 'lodash-es' ;
88
99import {
1010 ConfigurationParameter ,
11- NumberParameter ,
1211 TrainingConfiguration ,
1312} from '../../../../../../../../core/configurable-parameters/services/configuration.interface' ;
1413import { Accordion } from '../../ui/accordion/accordion.component' ;
1514import { ResetButton } from '../../ui/reset-button.component' ;
1615import { SubsetsDistributionSlider } from './subsets-distribution-slider/subsets-distribution-slider.component' ;
17- import { areSubsetsSizesValid , getSubsetsSizes , MAX_RATIO_VALUE } from './utils' ;
16+ import {
17+ areSubsetsSizesValid ,
18+ getSubsets ,
19+ getSubsetsSizes ,
20+ MAX_RATIO_VALUE ,
21+ TEST_SUBSET_KEY ,
22+ TRAINING_SUBSET_KEY ,
23+ VALIDATION_SUBSET_KEY ,
24+ } from './utils' ;
1825
1926import styles from './training-subsets.module.scss' ;
2027
@@ -71,7 +78,6 @@ interface SubsetsDistributionProps {
7178 onSubsetsDistributionChange : ( values : number [ ] ) => void ;
7279 onSubsetsDistributionChangeEnd : ( values : number [ ] ) => void ;
7380 onSubsetsDistributionReset : ( ) => void ;
74- subsetParameters : SubsetsParameters ;
7581}
7682
7783const SubsetsDistribution : FC < SubsetsDistributionProps > = ( {
@@ -82,24 +88,15 @@ const SubsetsDistribution: FC<SubsetsDistributionProps> = ({
8288 onSubsetsDistributionChange,
8389 onSubsetsDistributionChangeEnd,
8490 onSubsetsDistributionReset,
85- subsetParameters,
8691} ) => {
8792 const handleSubsetDistributionChange = ( values : number [ ] | number ) : void => {
8893 if ( Array . isArray ( values ) ) {
89- if ( ! areSubsetsSizesValid ( subsetParameters , values ) ) {
90- return ;
91- }
92-
9394 onSubsetsDistributionChange ( values ) ;
9495 }
9596 } ;
9697
9798 const handleSubsetDistributionChangeEnd = ( values : number [ ] | number ) : void => {
9899 if ( Array . isArray ( values ) ) {
99- if ( ! areSubsetsSizesValid ( subsetParameters , values ) ) {
100- return ;
101- }
102-
103100 onSubsetsDistributionChangeEnd ( values ) ;
104101 }
105102 } ;
@@ -141,40 +138,24 @@ type SubsetsParameters = TrainingConfiguration['datasetPreparation']['subsetSpli
141138
142139interface TrainingSubsetsProps {
143140 hasSupportedModels : boolean ;
141+
142+ defaultSubsetParameters : SubsetsParameters ;
143+
144144 subsetsParameters : SubsetsParameters ;
145145 onUpdateTrainingConfiguration : (
146146 updateFunction : ( config : TrainingConfiguration | undefined ) => TrainingConfiguration | undefined
147147 ) => void ;
148148}
149149
150- const TEST_SUBSET_KEY = 'test' ;
151- const VALIDATION_SUBSET_KEY = 'validation' ;
152- const TRAINING_SUBSET_KEY = 'training' ;
153-
154- const getSubsets = ( subsetsParameters : SubsetsParameters ) => {
155- const validationSubset = subsetsParameters . find (
156- ( parameter ) => parameter . key === VALIDATION_SUBSET_KEY
157- ) as NumberParameter ;
158- const trainingSubset = subsetsParameters . find (
159- ( parameter ) => parameter . key === TRAINING_SUBSET_KEY
160- ) as NumberParameter ;
161-
162- return {
163- trainingSubset,
164- validationSubset,
165- } ;
166- } ;
167-
168150const TrainingSubsetsUnavailable = ( ) => {
169151 return (
170152 < InlineAlert variant = { 'notice' } >
171- < Heading > Training subsets configuration unavailable </ Heading >
153+ < Heading > Invalid training subsets configuration</ Heading >
172154 < Content >
173- The training, validation, and testing subsets are currently unavailable because the project does not
174- contain enough media items to support a proper split .
155+ Training subsets do not contain enough media items to support a configurable split between training,
156+ validation, and testing subsets .
175157 < br />
176- To enable subset configuration, please add more media items so that each subset contains at least one
177- item.
158+ Please add more media items to ensure each subset contains at least one item.
178159 </ Content >
179160 </ InlineAlert >
180161 ) ;
@@ -196,12 +177,13 @@ const TrainingSubsetsChangedDistributionWarning = () => {
196177
197178export const TrainingSubsets : FC < TrainingSubsetsProps > = ( {
198179 hasSupportedModels,
180+ defaultSubsetParameters,
199181 subsetsParameters,
200182 onUpdateTrainingConfiguration,
201183} ) => {
202184 const { trainingSubset, validationSubset } = getSubsets ( subsetsParameters ) ;
203185
204- const prevSubsetParameters = useRef ( subsetsParameters ) ;
186+ const areTrainingSubsetParametersChanged = ! isEqual ( defaultSubsetParameters , subsetsParameters ) ;
205187
206188 const [ subsetsDistribution , setSubsetsDistribution ] = useState < number [ ] > ( [
207189 trainingSubset . value ,
@@ -274,9 +256,8 @@ export const TrainingSubsets: FC<TrainingSubsetsProps> = ({
274256 testSubsetRatio
275257 ) ;
276258
277- const subsetsSizesValid = areSubsetsSizesValid ( subsetsParameters , subsetsDistribution ) ;
278- const isChangedDistributionWarningVisible =
279- hasSupportedModels && ! isEqual ( prevSubsetParameters . current , subsetsParameters ) ;
259+ const subsetsSizesInvalid = areTrainingSubsetParametersChanged && ! areSubsetsSizesValid ( subsetsParameters ) ;
260+ const isChangedDistributionWarningVisible = hasSupportedModels && areTrainingSubsetParametersChanged ;
280261
281262 return (
282263 < Accordion >
@@ -295,9 +276,8 @@ export const TrainingSubsets: FC<TrainingSubsetsProps> = ({
295276 Each subset must have at least one media item.
296277 </ Accordion . Description >
297278 < Accordion . Divider marginY = { 'size-250' } />
298- < View UNSAFE_className = { subsetsSizesValid ? undefined : styles . disabled } >
279+ < View >
299280 < SubsetsDistribution
300- subsetParameters = { subsetsParameters }
301281 subsetsDistribution = { subsetsDistribution }
302282 onSubsetsDistributionChange = { setSubsetsDistribution }
303283 testSubsetSize = { testSubsetSize }
@@ -309,7 +289,7 @@ export const TrainingSubsets: FC<TrainingSubsetsProps> = ({
309289 </ View >
310290
311291 < Flex direction = { 'column' } gap = { 'size-200' } marginTop = { 'size-200' } >
312- { ! subsetsSizesValid && < TrainingSubsetsUnavailable /> }
292+ { subsetsSizesInvalid && < TrainingSubsetsUnavailable /> }
313293 { isChangedDistributionWarningVisible && < TrainingSubsetsChangedDistributionWarning /> }
314294 </ Flex >
315295 </ Accordion . Content >
0 commit comments