File size: 1,490 Bytes
b2ba7d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from dataclasses import dataclass, field

try:
    import trackio.utils as utils
except ImportError:
    import utils


@dataclass
class RunSelection:
    choices: list[str] = field(default_factory=list)
    selected: list[str] = field(default_factory=list)
    locked: bool = False

    def update_choices(
        self, runs: list[str], preferred: list[str] | None = None
    ) -> bool:
        if self.choices == runs:
            return False
        new_choices = set(runs) - set(self.choices)
        self.choices = list(runs)
        if self.locked:
            base = set(self.selected) | new_choices
        elif preferred:
            base = set(preferred)
        else:
            base = set(runs)
        self.selected = [run for run in self.choices if run in base]
        return True

    def select(self, runs: list[str]) -> list[str]:
        choice_set = set(self.choices)
        self.selected = [run for run in runs if run in choice_set]
        self.locked = True
        return self.selected

    def replace_group(
        self, group_runs: list[str], new_subset: list[str] | None
    ) -> tuple[list[str], list[str]]:
        new_subset = utils.ordered_subset(group_runs, new_subset)
        selection_set = set(self.selected)
        selection_set.difference_update(group_runs)
        selection_set.update(new_subset)
        self.selected = [run for run in self.choices if run in selection_set]
        self.locked = True
        return new_subset, self.selected