Skip to content

Commit 81aa958

Browse files
authored
ITEP-69433 refactor: Change active learning config logic to make it easy to use project configuration (#420)
1 parent 90a2608 commit 81aa958

6 files changed

Lines changed: 121 additions & 114 deletions

File tree

web_ui/src/core/configurable-parameters/hooks/use-reconfig-auto-training.hook.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
} from '../services/configurable-parameters.interface';
1717
import { getReconfigureParametersDTO, updateSelectedParameter } from '../utils';
1818

19-
interface UseReconfigureParams {
19+
export interface UseReconfigureParams {
2020
configParameters: ConfigurableParametersTaskChain[];
2121
newConfigParameter: ConfigurableParametersParams;
2222
onOptimisticUpdate: (newConfig: ConfigurableParametersTaskChain[]) => ConfigurableParametersTaskChain[];

web_ui/src/core/configurable-parameters/services/configuration.interface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ interface ParameterBase {
77
description: string;
88
}
99

10-
interface NumberParameter extends ParameterBase {
10+
export interface NumberParameter extends ParameterBase {
1111
type: 'int' | 'float';
1212
value: number;
1313
minValue: number;

web_ui/src/shared/components/header/active-learning-configuration/training-settings/auto-training-config-switch.component.tsx

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,46 +5,24 @@ import { FC } from 'react';
55

66
import { Flex, Switch, Text } from '@geti/ui';
77

8-
import { useReconfigAutoTraining } from '../../../../../core/configurable-parameters/hooks/use-reconfig-auto-training.hook';
9-
import {
10-
BooleanGroupParams,
11-
ConfigurableParametersTaskChain,
12-
} from '../../../../../core/configurable-parameters/services/configurable-parameters.interface';
13-
import { findAutoTrainingConfig } from '../../../../../core/configurable-parameters/utils';
148
import { Task } from '../../../../../core/projects/task.interface';
159
import { idMatchingFormat } from '../../../../../test-utils/id-utils';
1610

1711
interface AutoTrainingConfigSwitchProps {
1812
task: Task;
1913
isDisabled: boolean;
20-
trainingConfig: BooleanGroupParams;
21-
autoTrainingOptimisticUpdates: ReturnType<typeof useReconfigAutoTraining>;
22-
configParameters: ConfigurableParametersTaskChain[];
14+
isAutoTrainingEnabled: boolean;
15+
onAutoTraining: (value: boolean) => void;
2316
}
2417

2518
export const AutoTrainingConfigSwitch: FC<AutoTrainingConfigSwitchProps> = ({
2619
task,
2720
isDisabled,
28-
autoTrainingOptimisticUpdates,
29-
configParameters,
30-
trainingConfig,
21+
onAutoTraining,
22+
isAutoTrainingEnabled,
3123
}) => {
3224
const onChange = () => {
33-
autoTrainingOptimisticUpdates.mutate({
34-
configParameters,
35-
newConfigParameter: {
36-
...trainingConfig,
37-
value: !trainingConfig.value,
38-
},
39-
onOptimisticUpdate: (config) => {
40-
const autoTrainingConfig = findAutoTrainingConfig(task.id, config);
41-
if (autoTrainingConfig !== undefined) {
42-
autoTrainingConfig.value = !autoTrainingConfig.value;
43-
}
44-
45-
return config;
46-
},
47-
});
25+
onAutoTraining(!isAutoTrainingEnabled);
4826
};
4927

5028
return (
@@ -53,7 +31,7 @@ export const AutoTrainingConfigSwitch: FC<AutoTrainingConfigSwitchProps> = ({
5331
isEmphasized
5432
justifySelf={'end'}
5533
aria-label={`Toggle auto training for ${task.title}`}
56-
isSelected={trainingConfig.value}
34+
isSelected={isAutoTrainingEnabled}
5735
isDisabled={isDisabled}
5836
onChange={onChange}
5937
id={`training-switch-${idMatchingFormat(task.title)}`}

web_ui/src/shared/components/header/active-learning-configuration/training-settings/auto-training-switch.component.tsx

Lines changed: 95 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,20 @@ import { paths } from '@geti/core';
77
import { Divider, Flex, Text, View } from '@geti/ui';
88
import { isEmpty, isEqual } from 'lodash-es';
99

10-
import { useReconfigAutoTraining } from '../../../../../core/configurable-parameters/hooks/use-reconfig-auto-training.hook';
10+
import {
11+
useReconfigAutoTraining,
12+
UseReconfigureParams,
13+
} from '../../../../../core/configurable-parameters/hooks/use-reconfig-auto-training.hook';
1114
import {
1215
BooleanGroupParams,
1316
ConfigurableParametersTaskChain,
1417
NumberGroupParams,
1518
} from '../../../../../core/configurable-parameters/services/configurable-parameters.interface';
19+
import {
20+
findAutoTrainingConfig,
21+
findDynamicRequiredAnnotationsConfig,
22+
findRequiredImagesAutoTrainingConfig,
23+
} from '../../../../../core/configurable-parameters/utils';
1624
import { useGetRunningJobs } from '../../../../../core/jobs/hooks/use-jobs.hook';
1725
import { RunningJobProps, RunningTrainingJob } from '../../../../../core/jobs/jobs.interface';
1826
import { ModelsGroups } from '../../../../../core/models/models.interface';
@@ -113,6 +121,87 @@ export const AutoTrainingSwitch: FC<AutoTrainingSwitchProps> = ({
113121
hasEqualProjectAndTask(projectIdentifier.projectId, task.title)
114122
);
115123

124+
const updateTrainingParametersLegacy = ({
125+
newConfigParameter,
126+
onOptimisticUpdate,
127+
}: Pick<UseReconfigureParams, 'newConfigParameter' | 'onOptimisticUpdate'>) => {
128+
autoTrainingOptimisticUpdates.mutate({
129+
configParameters,
130+
onOptimisticUpdate,
131+
newConfigParameter,
132+
});
133+
};
134+
135+
const updateDynamicRequiredAnnotations = (value: boolean) => {
136+
if (dynamicRequiredAnnotationsConfig === undefined) {
137+
return;
138+
}
139+
140+
updateTrainingParametersLegacy({
141+
newConfigParameter: {
142+
...dynamicRequiredAnnotationsConfig,
143+
value,
144+
},
145+
onOptimisticUpdate: (config) => {
146+
const dynamicRequiredAnnotationsConfigOptimistic = findDynamicRequiredAnnotationsConfig(
147+
task.id,
148+
config
149+
);
150+
if (dynamicRequiredAnnotationsConfigOptimistic !== undefined) {
151+
dynamicRequiredAnnotationsConfigOptimistic.value = value;
152+
}
153+
154+
return config;
155+
},
156+
});
157+
};
158+
159+
const updateNumberOfRequiredAnnotations = (newNumberOfRequiredAnnotations: number) => {
160+
if (requiredImagesAutoTrainingConfig === undefined) {
161+
return;
162+
}
163+
164+
updateTrainingParametersLegacy({
165+
newConfigParameter: {
166+
...requiredImagesAutoTrainingConfig,
167+
value: newNumberOfRequiredAnnotations,
168+
},
169+
onOptimisticUpdate: (config) => {
170+
const requiredImagesAutoTrainingConfigOptimistic = findRequiredImagesAutoTrainingConfig(
171+
task.id,
172+
config
173+
);
174+
175+
if (requiredImagesAutoTrainingConfigOptimistic !== undefined) {
176+
requiredImagesAutoTrainingConfigOptimistic.value = newNumberOfRequiredAnnotations;
177+
}
178+
179+
return config;
180+
},
181+
});
182+
};
183+
184+
const updateAutoTraining = (value: boolean) => {
185+
if (trainingConfig === undefined) {
186+
return;
187+
}
188+
189+
updateTrainingParametersLegacy({
190+
newConfigParameter: {
191+
...trainingConfig,
192+
value,
193+
},
194+
onOptimisticUpdate: (config) => {
195+
const autoTrainingConfig = findAutoTrainingConfig(task.id, config);
196+
if (autoTrainingConfig !== undefined) {
197+
autoTrainingConfig.value = value;
198+
}
199+
200+
return config;
201+
},
202+
});
203+
};
204+
116205
const isAutotrainingOn = Boolean(trainingConfig?.value);
117206

118207
const hasRunningJobs = !isEmpty(runningTaskJobs);
@@ -132,21 +221,19 @@ export const AutoTrainingSwitch: FC<AutoTrainingSwitchProps> = ({
132221
<AutoTrainingConfigSwitch
133222
task={task}
134223
isDisabled={hasRunningJobs}
135-
autoTrainingOptimisticUpdates={autoTrainingOptimisticUpdates}
136-
configParameters={configParameters}
137-
trainingConfig={trainingConfig}
224+
isAutoTrainingEnabled={trainingConfig.value}
225+
onAutoTraining={updateAutoTraining}
138226
/>
139227
)}
140228

141229
{isAutotrainingOn &&
142230
requiredImagesAutoTrainingConfig !== undefined &&
143231
dynamicRequiredAnnotationsConfig !== undefined && (
144232
<AutoTrainingThreshold
145-
task={task}
146-
autoTrainingOptimisticUpdates={autoTrainingOptimisticUpdates}
147-
configParameters={configParameters}
148233
requiredImagesAutoTrainingConfig={requiredImagesAutoTrainingConfig}
149-
dynamicRequiredAnnotationsConfig={dynamicRequiredAnnotationsConfig}
234+
dynamicRequiredAnnotations={dynamicRequiredAnnotationsConfig.value}
235+
onUpdateDynamicRequiredAnnotations={updateDynamicRequiredAnnotations}
236+
onUpdateRequiredAnnotations={updateNumberOfRequiredAnnotations}
150237
/>
151238
)}
152239
</Flex>

web_ui/src/shared/components/header/active-learning-configuration/training-settings/auto-training-threshold.component.tsx

Lines changed: 12 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,8 @@ import { FC } from 'react';
55

66
import { Content, ContextualHelp, Flex, Radio, RadioGroup, Text } from '@geti/ui';
77

8-
import { useReconfigAutoTraining } from '../../../../../core/configurable-parameters/hooks/use-reconfig-auto-training.hook';
9-
import {
10-
BooleanGroupParams,
11-
ConfigurableParametersTaskChain,
12-
NumberGroupParams,
13-
} from '../../../../../core/configurable-parameters/services/configurable-parameters.interface';
14-
import { findDynamicRequiredAnnotationsConfig } from '../../../../../core/configurable-parameters/utils';
15-
import { Task } from '../../../../../core/projects/task.interface';
8+
import { NumberGroupParams } from '../../../../../core/configurable-parameters/services/configurable-parameters.interface';
9+
import { NumberParameter } from '../../../../../core/configurable-parameters/services/configuration.interface';
1610
import { RequiredAnnotationsSlider } from './required-annotations-slider.component';
1711

1812
enum AutoTrainingThresholdOption {
@@ -39,46 +33,27 @@ const AutoTrainingThresholdContextualHelp: FC = () => {
3933
};
4034

4135
interface AutoTrainingThresholdProps {
42-
task: Task;
43-
requiredImagesAutoTrainingConfig: NumberGroupParams;
44-
dynamicRequiredAnnotationsConfig: BooleanGroupParams;
45-
autoTrainingOptimisticUpdates: ReturnType<typeof useReconfigAutoTraining>;
46-
configParameters: ConfigurableParametersTaskChain[];
36+
requiredImagesAutoTrainingConfig: NumberGroupParams | NumberParameter;
37+
dynamicRequiredAnnotations: boolean;
38+
onUpdateDynamicRequiredAnnotations: (value: boolean) => void;
39+
onUpdateRequiredAnnotations: (newNumberOfRequiredAnnotations: number) => void;
4740
}
4841

4942
export const AutoTrainingThreshold: FC<AutoTrainingThresholdProps> = ({
50-
task,
5143
requiredImagesAutoTrainingConfig,
52-
dynamicRequiredAnnotationsConfig,
53-
autoTrainingOptimisticUpdates,
54-
configParameters,
44+
dynamicRequiredAnnotations,
45+
onUpdateRequiredAnnotations,
46+
onUpdateDynamicRequiredAnnotations,
5547
}) => {
56-
const selectedThresholdOption = dynamicRequiredAnnotationsConfig.value
48+
const selectedThresholdOption = dynamicRequiredAnnotations
5749
? AutoTrainingThresholdOption.ADAPTIVE
5850
: AutoTrainingThresholdOption.FIXED;
5951
const isFixedThreshold = selectedThresholdOption === AutoTrainingThresholdOption.FIXED;
6052

6153
const handleThresholdOptionChange = (value: string): void => {
6254
const isAdaptiveSelected = value === AutoTrainingThresholdOption.ADAPTIVE;
6355

64-
autoTrainingOptimisticUpdates.mutate({
65-
configParameters,
66-
newConfigParameter: {
67-
...dynamicRequiredAnnotationsConfig,
68-
value: isAdaptiveSelected,
69-
},
70-
onOptimisticUpdate: (config) => {
71-
const dynamicRequiredAnnotationsConfigOptimistic = findDynamicRequiredAnnotationsConfig(
72-
task.id,
73-
config
74-
);
75-
if (dynamicRequiredAnnotationsConfigOptimistic !== undefined) {
76-
dynamicRequiredAnnotationsConfigOptimistic.value = isAdaptiveSelected;
77-
}
78-
79-
return config;
80-
},
81-
});
56+
onUpdateDynamicRequiredAnnotations(isAdaptiveSelected);
8257
};
8358

8459
return (
@@ -97,10 +72,8 @@ export const AutoTrainingThreshold: FC<AutoTrainingThresholdProps> = ({
9772

9873
{isFixedThreshold && (
9974
<RequiredAnnotationsSlider
100-
task={task}
101-
autoTrainingOptimisticUpdates={autoTrainingOptimisticUpdates}
102-
configParameters={configParameters}
10375
requiredImagesAutoTrainingConfig={requiredImagesAutoTrainingConfig}
76+
onUpdateRequiredAnnotations={onUpdateRequiredAnnotations}
10477
/>
10578
)}
10679
</>

web_ui/src/shared/components/header/active-learning-configuration/training-settings/required-annotations-slider.component.tsx

Lines changed: 6 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,53 +5,22 @@ import { FC, useState } from 'react';
55

66
import { Flex, Slider, Text, View } from '@geti/ui';
77

8-
import { useReconfigAutoTraining } from '../../../../../core/configurable-parameters/hooks/use-reconfig-auto-training.hook';
9-
import {
10-
ConfigurableParametersTaskChain,
11-
NumberGroupParams,
12-
} from '../../../../../core/configurable-parameters/services/configurable-parameters.interface';
13-
import { findRequiredImagesAutoTrainingConfig } from '../../../../../core/configurable-parameters/utils';
14-
import { Task } from '../../../../../core/projects/task.interface';
8+
import { NumberGroupParams } from '../../../../../core/configurable-parameters/services/configurable-parameters.interface';
9+
import { NumberParameter } from '../../../../../core/configurable-parameters/services/configuration.interface';
1510

1611
interface RequiredAnnotationsSliderProps {
17-
task: Task;
18-
requiredImagesAutoTrainingConfig: NumberGroupParams;
19-
autoTrainingOptimisticUpdates: ReturnType<typeof useReconfigAutoTraining>;
20-
configParameters: ConfigurableParametersTaskChain[];
12+
requiredImagesAutoTrainingConfig: NumberGroupParams | NumberParameter;
13+
onUpdateRequiredAnnotations: (newNumberOfRequiredAnnotations: number) => void;
2114
}
2215

2316
export const RequiredAnnotationsSlider: FC<RequiredAnnotationsSliderProps> = ({
24-
task,
2517
requiredImagesAutoTrainingConfig,
26-
autoTrainingOptimisticUpdates,
27-
configParameters,
18+
onUpdateRequiredAnnotations,
2819
}) => {
2920
const [numberOfRequiredAnnotations, setNumberOfRequiredAnnotations] = useState<number>(
3021
requiredImagesAutoTrainingConfig.value
3122
);
3223

33-
const handleRequiredAnnotationsChange = (newNumberOfRequiredAnnotations: number) => {
34-
autoTrainingOptimisticUpdates.mutate({
35-
configParameters,
36-
newConfigParameter: {
37-
...requiredImagesAutoTrainingConfig,
38-
value: newNumberOfRequiredAnnotations,
39-
},
40-
onOptimisticUpdate: (config) => {
41-
const requiredImagesAutoTrainingConfigOptimistic = findRequiredImagesAutoTrainingConfig(
42-
task.id,
43-
config
44-
);
45-
46-
if (requiredImagesAutoTrainingConfigOptimistic !== undefined) {
47-
requiredImagesAutoTrainingConfigOptimistic.value = newNumberOfRequiredAnnotations;
48-
}
49-
50-
return config;
51-
},
52-
});
53-
};
54-
5524
return (
5625
<Flex alignItems={'center'} gap={'size-100'}>
5726
<Slider
@@ -60,7 +29,7 @@ export const RequiredAnnotationsSlider: FC<RequiredAnnotationsSliderProps> = ({
6029
minValue={requiredImagesAutoTrainingConfig.minValue}
6130
maxValue={requiredImagesAutoTrainingConfig.maxValue}
6231
onChange={setNumberOfRequiredAnnotations}
63-
onChangeEnd={handleRequiredAnnotationsChange}
32+
onChangeEnd={onUpdateRequiredAnnotations}
6433
label={'Number of required annotations'}
6534
getValueLabel={() => ''}
6635
isFilled

0 commit comments

Comments
 (0)