h2o-llmstudio
75 строк · 2.2 Кб
1from collections import defaultdict2from dataclasses import dataclass3from typing import DefaultDict, List, Optional, Set, Union4
5
6@dataclass
7class Dependency:8"""Dependency class.9
10Args:
11key: key of the dependency
12value: required value of the dependency, None for empty condition
13is_set: whether the dependency should be set, or not set
14"""
15
16key: str17value: Union[str, bool, int, None] = True18is_set: bool = True19
20def check(self, dependency_values: Optional[List[str]]) -> bool:21"""22Check if dependency is satisfied
23
24Args:
25dependency_values: list of dependency values
26
27Returns:
28True if the dependency is satisfied, False otherwise
29"""
30
31if dependency_values is None:32dependency_values = []33
34if self.value is None and self.is_set and len(dependency_values):35return False36elif self.value is None and not self.is_set and not len(dependency_values):37return False38elif self.is_set and self.value not in dependency_values:39return False40elif (41not self.is_set42and len([v for v in dependency_values if v != self.value]) == 043):44return False45return True46
47
48class Nesting:49"""50A tree-like structure to specify nested dependencies of key-value pairs
51In detail it maps dependencies of key requiring any number of key:value pairs
52
53Primarily useful for specifying nested dependencies of UI elements shown in Wave.
54"""
55
56def __init__(self):57self.dependencies: DefaultDict[str, List[Dependency]] = defaultdict(list)58self.triggers: Set[str] = set()59
60def add(self, keys: List[str], dependencies: List[Dependency]):61"""62Append dependencies (key:value) for a given key
63
64Args:
65keys: keys to add dependencies for
66dependencies: key:value pairs to depend on
67"""
68
69if len(set(keys)) != len(keys):70raise ValueError("Nesting keys must be unique.")71
72for dependency in dependencies:73self.triggers.add(dependency.key)74for key in set(keys):75self.dependencies[key].append(dependency)76