valor-lite 0.36.3__py3-none-any.whl → 0.36.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -144,18 +144,18 @@ class Evaluator:
144
144
 
145
145
  def create_filter(
146
146
  self,
147
- datum_ids: list[str] | None = None,
148
- labels: list[str] | None = None,
147
+ datums: list[str] | NDArray[np.int32] | None = None,
148
+ labels: list[str] | NDArray[np.int32] | None = None,
149
149
  ) -> Filter:
150
150
  """
151
151
  Creates a filter object.
152
152
 
153
153
  Parameters
154
154
  ----------
155
- datum_uids : list[str], optional
156
- An optional list of string uids representing datums.
157
- labels : list[str], optional
158
- An optional list of labels.
155
+ datums : list[str] | NDArray[int32], optional
156
+ An optional list of string uids or integer indices representing datums.
157
+ labels : list[str] | NDArray[int32], optional
158
+ An optional list of strings or integer indices representing labels.
159
159
 
160
160
  Returns
161
161
  -------
@@ -165,50 +165,72 @@ class Evaluator:
165
165
  # create datum mask
166
166
  n_pairs = self._detailed_pairs.shape[0]
167
167
  datum_mask = np.ones(n_pairs, dtype=np.bool_)
168
- if datum_ids is not None:
169
- if not datum_ids:
170
- return Filter(
171
- datum_mask=np.zeros_like(datum_mask),
172
- valid_label_indices=None,
173
- metadata=Metadata(),
168
+ if datums is not None:
169
+ # convert to array of valid datum indices
170
+ if isinstance(datums, list):
171
+ datums = np.array(
172
+ [self.datum_id_to_index[uid] for uid in datums],
173
+ dtype=np.int32,
174
174
  )
175
- valid_datum_indices = np.array(
176
- [self.datum_id_to_index[uid] for uid in datum_ids],
177
- dtype=np.int32,
178
- )
179
- datum_mask = np.isin(
180
- self._detailed_pairs[:, 0], valid_datum_indices
181
- )
175
+
176
+ # return early if all data removed
177
+ if datums.size == 0:
178
+ raise EmptyFilterError("filter removes all datums")
179
+
180
+ # validate indices
181
+ if datums.max() >= len(self.index_to_datum_id):
182
+ raise ValueError(
183
+ f"datum index '{datums.max()}' exceeds total number of datums"
184
+ )
185
+ elif datums.min() < 0:
186
+ raise ValueError(
187
+ f"datum index '{datums.min()}' is a negative value"
188
+ )
189
+
190
+ # create datum mask
191
+ datum_mask = np.isin(self._detailed_pairs[:, 0], datums)
182
192
 
183
193
  # collect valid label indices
184
- valid_label_indices = None
185
194
  if labels is not None:
186
- if not labels:
187
- return Filter(
188
- datum_mask=datum_mask,
189
- valid_label_indices=np.array([], dtype=np.int32),
190
- metadata=Metadata(),
195
+ # convert to array of valid label indices
196
+ if isinstance(labels, list):
197
+ labels = np.array(
198
+ [self.label_to_index[label] for label in labels]
191
199
  )
192
- valid_label_indices = np.array(
193
- [self.label_to_index[label] for label in labels] + [-1]
194
- )
200
+
201
+ # return early if all data removed
202
+ if labels.size == 0:
203
+ raise EmptyFilterError("filter removes all labels")
204
+
205
+ # validate indices
206
+ if labels.max() >= len(self.index_to_label):
207
+ raise ValueError(
208
+ f"label index '{labels.max()}' exceeds total number of labels"
209
+ )
210
+ elif labels.min() < 0:
211
+ raise ValueError(
212
+ f"label index '{labels.min()}' is a negative value"
213
+ )
214
+
215
+ # add -1 to represent null labels which should not be filtered
216
+ labels = np.concatenate([labels, np.array([-1])])
195
217
 
196
218
  filtered_detailed_pairs, _ = filter_cache(
197
219
  detailed_pairs=self._detailed_pairs,
198
220
  datum_mask=datum_mask,
199
- valid_label_indices=valid_label_indices,
221
+ valid_label_indices=labels,
200
222
  n_labels=self.metadata.number_of_labels,
201
223
  )
202
224
 
203
225
  number_of_datums = (
204
- len(datum_ids)
205
- if datum_ids is not None
226
+ datums.size
227
+ if datums is not None
206
228
  else self.metadata.number_of_datums
207
229
  )
208
230
 
209
231
  return Filter(
210
232
  datum_mask=datum_mask,
211
- valid_label_indices=valid_label_indices,
233
+ valid_label_indices=labels,
212
234
  metadata=Metadata.create(
213
235
  detailed_pairs=filtered_detailed_pairs,
214
236
  number_of_datums=number_of_datums,
@@ -173,38 +173,52 @@ class Evaluator:
173
173
 
174
174
  def create_filter(
175
175
  self,
176
- datum_ids: list[str] | None = None,
177
- groundtruth_ids: list[str] | None = None,
178
- prediction_ids: list[str] | None = None,
179
- labels: list[str] | None = None,
176
+ datums: list[str] | NDArray[np.int32] | None = None,
177
+ groundtruths: list[str] | NDArray[np.int32] | None = None,
178
+ predictions: list[str] | NDArray[np.int32] | None = None,
179
+ labels: list[str] | NDArray[np.int32] | None = None,
180
180
  ) -> Filter:
181
181
  """
182
182
  Creates a filter object.
183
183
 
184
184
  Parameters
185
185
  ----------
186
- datum_uids : list[str], optional
187
- An optional list of string uids representing datums to keep.
188
- groundtruth_ids : list[str], optional
189
- An optional list of string uids representing ground truth annotations to keep.
190
- prediction_ids : list[str], optional
191
- An optional list of string uids representing prediction annotations to keep.
192
- labels : list[str], optional
193
- An optional list of labels to keep.
186
+ datum : list[str] | NDArray[int32], optional
187
+ An optional list of string ids or indices representing datums to keep.
188
+ groundtruth : list[str] | NDArray[int32], optional
189
+ An optional list of string ids or indices representing ground truth annotations to keep.
190
+ prediction : list[str] | NDArray[int32], optional
191
+ An optional list of string ids or indices representing prediction annotations to keep.
192
+ labels : list[str] | NDArray[int32], optional
193
+ An optional list of labels or indices to keep.
194
194
  """
195
195
  mask_datums = np.ones(self._detailed_pairs.shape[0], dtype=np.bool_)
196
196
 
197
197
  # filter datums
198
- if datum_ids is not None:
199
- if not datum_ids:
200
- raise EmptyFilterError("filter removes all datums")
201
- valid_datum_indices = np.array(
202
- [self.datum_id_to_index[uid] for uid in datum_ids],
203
- dtype=np.int32,
204
- )
205
- mask_datums = np.isin(
206
- self._detailed_pairs[:, 0], valid_datum_indices
207
- )
198
+ if datums is not None:
199
+ # convert to indices
200
+ if isinstance(datums, list):
201
+ datums = np.array(
202
+ [self.datum_id_to_index[uid] for uid in datums],
203
+ dtype=np.int32,
204
+ )
205
+
206
+ # validate indices
207
+ if datums.size == 0:
208
+ raise EmptyFilterError(
209
+ "filter removes all datums"
210
+ ) # validate indices
211
+ elif datums.min() < 0:
212
+ raise ValueError(
213
+ f"datum index cannot be negative '{datums.min()}'"
214
+ )
215
+ elif datums.max() >= len(self.index_to_datum_id):
216
+ raise ValueError(
217
+ f"datum index cannot exceed total number of datums '{datums.max()}'"
218
+ )
219
+
220
+ # apply to mask
221
+ mask_datums = np.isin(self._detailed_pairs[:, 0], datums)
208
222
 
209
223
  filtered_detailed_pairs = self._detailed_pairs[mask_datums]
210
224
  n_pairs = self._detailed_pairs[mask_datums].shape[0]
@@ -212,43 +226,93 @@ class Evaluator:
212
226
  mask_predictions = np.zeros_like(mask_groundtruths)
213
227
 
214
228
  # filter by ground truth annotation ids
215
- if groundtruth_ids is not None:
216
- valid_groundtruth_indices = np.array(
217
- [self.groundtruth_id_to_index[uid] for uid in groundtruth_ids],
218
- dtype=np.int32,
219
- )
229
+ if groundtruths is not None:
230
+ # convert to indices
231
+ if isinstance(groundtruths, list):
232
+ groundtruths = np.array(
233
+ [
234
+ self.groundtruth_id_to_index[uid]
235
+ for uid in groundtruths
236
+ ],
237
+ dtype=np.int32,
238
+ )
239
+
240
+ # validate indices
241
+ if groundtruths.size == 0:
242
+ warnings.warn("filter removes all ground truths")
243
+ elif groundtruths.min() < 0:
244
+ raise ValueError(
245
+ f"groundtruth annotation index cannot be negative '{groundtruths.min()}'"
246
+ )
247
+ elif groundtruths.max() >= len(self.index_to_groundtruth_id):
248
+ raise ValueError(
249
+ f"groundtruth annotation index cannot exceed total number of groundtruths '{groundtruths.max()}'"
250
+ )
251
+
252
+ # apply to mask
220
253
  mask_groundtruths[
221
254
  ~np.isin(
222
255
  filtered_detailed_pairs[:, 1],
223
- valid_groundtruth_indices,
256
+ groundtruths,
224
257
  )
225
258
  ] = True
226
259
 
227
260
  # filter by prediction annotation ids
228
- if prediction_ids is not None:
229
- valid_prediction_indices = np.array(
230
- [self.prediction_id_to_index[uid] for uid in prediction_ids],
231
- dtype=np.int32,
232
- )
261
+ if predictions is not None:
262
+ # convert to indices
263
+ if isinstance(predictions, list):
264
+ predictions = np.array(
265
+ [self.prediction_id_to_index[uid] for uid in predictions],
266
+ dtype=np.int32,
267
+ )
268
+
269
+ # validate indices
270
+ if predictions.size == 0:
271
+ warnings.warn("filter removes all predictions")
272
+ elif predictions.min() < 0:
273
+ raise ValueError(
274
+ f"prediction annotation index cannot be negative '{predictions.min()}'"
275
+ )
276
+ elif predictions.max() >= len(self.index_to_prediction_id):
277
+ raise ValueError(
278
+ f"prediction annotation index cannot exceed total number of predictions '{predictions.max()}'"
279
+ )
280
+
281
+ # apply to mask
233
282
  mask_predictions[
234
283
  ~np.isin(
235
284
  filtered_detailed_pairs[:, 2],
236
- valid_prediction_indices,
285
+ predictions,
237
286
  )
238
287
  ] = True
239
288
 
240
289
  # filter by labels
241
290
  if labels is not None:
242
- if not labels:
291
+ # convert to indices
292
+ if isinstance(labels, list):
293
+ labels = np.array(
294
+ [self.label_to_index[label] for label in labels]
295
+ )
296
+
297
+ # validate indices
298
+ if labels.size == 0:
243
299
  raise EmptyFilterError("filter removes all labels")
244
- valid_label_indices = np.array(
245
- [self.label_to_index[label] for label in labels] + [-1]
246
- )
300
+ elif labels.min() < 0:
301
+ raise ValueError(
302
+ f"label index cannot be negative '{labels.min()}'"
303
+ )
304
+ elif labels.max() >= len(self.index_to_label):
305
+ raise ValueError(
306
+ f"label index cannot exceed total number of labels '{labels.max()}'"
307
+ )
308
+
309
+ # apply to mask
310
+ labels = np.concatenate([labels, np.array([-1])]) # add null label
247
311
  mask_groundtruths[
248
- ~np.isin(filtered_detailed_pairs[:, 3], valid_label_indices)
312
+ ~np.isin(filtered_detailed_pairs[:, 3], labels)
249
313
  ] = True
250
314
  mask_predictions[
251
- ~np.isin(filtered_detailed_pairs[:, 4], valid_label_indices)
315
+ ~np.isin(filtered_detailed_pairs[:, 4], labels)
252
316
  ] = True
253
317
 
254
318
  filtered_detailed_pairs, _, _ = filter_cache(
@@ -260,8 +324,8 @@ class Evaluator:
260
324
  )
261
325
 
262
326
  number_of_datums = (
263
- len(datum_ids)
264
- if datum_ids
327
+ datums.size
328
+ if datums is not None
265
329
  else np.unique(filtered_detailed_pairs[:, 0]).size
266
330
  )
267
331
 
@@ -1,3 +1,4 @@
1
+ import warnings
1
2
  from dataclasses import dataclass, field
2
3
 
3
4
  import numpy as np
@@ -79,30 +80,37 @@ class Segmentation:
79
80
  )
80
81
  self.size = self.shape[0] * self.shape[1]
81
82
 
82
- mask_accumulation = None
83
- for groundtruth in self.groundtruths:
84
- if self.shape != groundtruth.mask.shape:
85
- raise ValueError(
86
- f"ground truth masks for datum '{self.uid}' should have shape '{self.shape}'. Received mask with shape '{groundtruth.mask.shape}'"
87
- )
88
-
89
- if mask_accumulation is None:
90
- mask_accumulation = groundtruth.mask.copy()
91
- elif np.logical_and(mask_accumulation, groundtruth.mask).any():
92
- raise ValueError("ground truth masks cannot overlap")
93
- else:
94
- mask_accumulation = mask_accumulation | groundtruth.mask
83
+ self._validate_bitmasks(self.groundtruths, "ground truth")
84
+ self._validate_bitmasks(self.predictions, "prediction")
95
85
 
86
+ def _validate_bitmasks(self, bitmasks: list[Bitmask], key: str):
96
87
  mask_accumulation = None
97
- for prediction in self.predictions:
98
- if self.shape != prediction.mask.shape:
88
+ mask_overlap_accumulation = None
89
+ for idx, bitmask in enumerate(bitmasks):
90
+ if not isinstance(bitmask, Bitmask):
91
+ raise ValueError(f"expected 'Bitmask', got '{bitmask}'")
92
+ if self.shape != bitmask.mask.shape:
99
93
  raise ValueError(
100
- f"prediction masks for datum '{self.uid}' should have shape '{self.shape}'. Received mask with shape '{prediction.mask.shape}'"
94
+ f"{key} masks for datum '{self.uid}' should have shape '{self.shape}'. Received mask with shape '{bitmask.mask.shape}'"
101
95
  )
102
96
 
103
97
  if mask_accumulation is None:
104
- mask_accumulation = prediction.mask.copy()
105
- elif np.logical_and(mask_accumulation, prediction.mask).any():
106
- raise ValueError("prediction masks cannot overlap")
98
+ mask_accumulation = bitmask.mask.copy()
99
+ mask_overlap_accumulation = np.zeros_like(mask_accumulation)
100
+ elif np.logical_and(mask_accumulation, bitmask.mask).any():
101
+ mask_overlap = np.logical_and(mask_accumulation, bitmask.mask)
102
+ bitmasks[idx].mask[mask_overlap] = False
103
+ mask_overlap_accumulation = (
104
+ mask_overlap_accumulation | mask_overlap
105
+ )
107
106
  else:
108
- mask_accumulation = mask_accumulation | prediction.mask
107
+ mask_accumulation = mask_accumulation | bitmask.mask
108
+ if (
109
+ mask_overlap_accumulation is not None
110
+ and mask_overlap_accumulation.any()
111
+ ):
112
+ count = mask_overlap_accumulation.sum()
113
+ total = mask_overlap_accumulation.size
114
+ warnings.warn(
115
+ f"{key} masks for datum '{self.uid}' had {count} / {total} pixels overlapped."
116
+ )
@@ -127,18 +127,18 @@ class Evaluator:
127
127
 
128
128
  def create_filter(
129
129
  self,
130
- datum_ids: list[str] | None = None,
131
- labels: list[str] | None = None,
130
+ datums: list[str] | NDArray[np.int64] | None = None,
131
+ labels: list[str] | NDArray[np.int64] | None = None,
132
132
  ) -> Filter:
133
133
  """
134
134
  Creates a filter for use with the evaluator.
135
135
 
136
136
  Parameters
137
137
  ----------
138
- datum_ids : list[str], optional
139
- An optional list of string uids representing datums.
140
- labels : list[str], optional
141
- An optional list of labels.
138
+ datums : list[str] | NDArray[int64], optional
139
+ An optional list of string ids or array of indices representing datums.
140
+ labels : list[str] | NDArray[int64], optional
141
+ An optional list of labels or array of indices.
142
142
 
143
143
  Returns
144
144
  -------
@@ -150,38 +150,61 @@ class Evaluator:
150
150
  self.metadata.number_of_labels + 1, dtype=np.bool_
151
151
  )
152
152
 
153
- if datum_ids is not None:
154
- if not datum_ids:
155
- return Filter(
156
- datum_mask=np.zeros_like(datum_mask),
157
- label_mask=label_mask,
158
- metadata=Metadata(),
153
+ if datums is not None:
154
+ # convert to indices
155
+ if isinstance(datums, list):
156
+ datums = np.array(
157
+ [self.datum_id_to_index[uid] for uid in datums],
158
+ dtype=np.int64,
159
159
  )
160
- datum_id_array = np.array(
161
- [self.datum_id_to_index[uid] for uid in datum_ids],
162
- dtype=np.int64,
163
- )
164
- datum_id_array.sort()
160
+
161
+ # validate indices
162
+ if datums.size == 0:
163
+ raise EmptyFilterError(
164
+ "filter removes all datums"
165
+ ) # validate indices
166
+ elif datums.min() < 0:
167
+ raise ValueError(
168
+ f"datum index cannot be negative '{datums.min()}'"
169
+ )
170
+ elif datums.max() >= len(self.index_to_datum_id):
171
+ raise ValueError(
172
+ f"datum index cannot exceed total number of datums '{datums.max()}'"
173
+ )
174
+
175
+ # apply to mask
176
+ datums.sort()
165
177
  mask_valid_datums = (
166
178
  np.arange(self._confusion_matrices.shape[0]).reshape(-1, 1)
167
- == datum_id_array.reshape(1, -1)
179
+ == datums.reshape(1, -1)
168
180
  ).any(axis=1)
169
181
  datum_mask[~mask_valid_datums] = False
170
182
 
171
183
  if labels is not None:
172
- if not labels:
173
- return Filter(
174
- datum_mask=datum_mask,
175
- label_mask=np.ones_like(label_mask),
176
- metadata=Metadata(),
184
+ # convert to indices
185
+ if isinstance(labels, list):
186
+ labels = np.array(
187
+ [self.label_to_index[label] for label in labels],
188
+ dtype=np.int64,
177
189
  )
178
- labels_id_array = np.array(
179
- [self.label_to_index[label] for label in labels] + [-1],
180
- dtype=np.int64,
181
- )
190
+
191
+ # validate indices
192
+ if labels.size == 0:
193
+ raise EmptyFilterError("filter removes all labels")
194
+ elif labels.min() < 0:
195
+ raise ValueError(
196
+ f"label index cannot be negative '{labels.min()}'"
197
+ )
198
+ elif labels.max() >= len(self.index_to_label):
199
+ raise ValueError(
200
+ f"label index cannot exceed total number of labels '{labels.max()}'"
201
+ )
202
+
203
+ # apply to mask
204
+ labels = np.concatenate([labels, np.array([-1])])
182
205
  label_range = np.arange(self.metadata.number_of_labels + 1) - 1
183
206
  mask_valid_labels = (
184
- label_range.reshape(-1, 1) == labels_id_array.reshape(1, -1)
207
+ label_range.reshape(-1, 1) == labels.reshape(1, -1)
185
208
  ).any(axis=1)
186
209
  label_mask[~mask_valid_labels] = True
187
210
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: valor-lite
3
- Version: 0.36.3
3
+ Version: 0.36.5
4
4
  Summary: Evaluate machine learning models.
5
5
  Project-URL: homepage, https://www.striveworks.com
6
6
  Requires-Python: >=3.10
@@ -6,21 +6,21 @@ valor_lite/schemas.py,sha256=pB0MrPx5qFLbwBWDiOUUm-vmXdWvbJLFCBmKgbcbI5g,198
6
6
  valor_lite/classification/__init__.py,sha256=KXaVwyqAbeeeEq7bzNPyt4GTpbxhrABjV7lR58KR6Y4,440
7
7
  valor_lite/classification/annotation.py,sha256=0aUOvcwBAZgiNOJuyh-pXyNTG7vP7r8CUfnU3OmpUwQ,1113
8
8
  valor_lite/classification/computation.py,sha256=kB5n-RHzDsKG75Guvgg25xAOeLEQCq1TgjwHwfwbQ60,12010
9
- valor_lite/classification/manager.py,sha256=OGLtdTkOlhyU5zpjRFy4c3zqZ2Lt3SV38J6hzbAXrJY,15905
9
+ valor_lite/classification/manager.py,sha256=JZwA9sf-OG7p7uK5qIo-D711kSpBDDeTcXsPr1uuIBI,16884
10
10
  valor_lite/classification/metric.py,sha256=nSNWjoxQ1ou7gxTPOYxLNoUYf7avKQzJq3NHR9jzM48,11693
11
11
  valor_lite/classification/numpy_compatibility.py,sha256=roqtTetsm1_HxuaejrthQdydjsRIy-FpXpGb86cLh_E,365
12
12
  valor_lite/classification/utilities.py,sha256=jAcir7dW-o4I2gk_NEmlRr8j8Iniyyq9QT5j3PMxVHk,6435
13
13
  valor_lite/object_detection/__init__.py,sha256=eSrVAOpSykk1CfHXIKy1necplonUGxjyVKyDQ5UZoBQ,343
14
14
  valor_lite/object_detection/annotation.py,sha256=LVec-rIk408LuFxcOoIkPk0QZMWSSxbmsady4wapC1s,7007
15
15
  valor_lite/object_detection/computation.py,sha256=njLN-1_yql56NSVxY4KGKohxJUIStPYczVTpEpj5geA,24478
16
- valor_lite/object_detection/manager.py,sha256=-DayHeOirI23pYCp2SqMv4EmsqYuADR95qXt1JMoNo8,27444
16
+ valor_lite/object_detection/manager.py,sha256=HfSbq4vfKv2Q3kBRIqpBbq7VCrOxCl7_Pd80yUl6TKQ,30053
17
17
  valor_lite/object_detection/metric.py,sha256=sUYSZwXYfIyfmXG6_7Tje1_ZL_QwvecPq85jrGmwOWE,22739
18
18
  valor_lite/object_detection/utilities.py,sha256=tNdv5dL7JhzOamGQkZ8x3ocZoTwPI6K8rcRAGMhp2nc,11217
19
19
  valor_lite/semantic_segmentation/__init__.py,sha256=3YdItCThY_tW23IChCBm-R0zahnbZ06JDVjs-gQLVes,293
20
- valor_lite/semantic_segmentation/annotation.py,sha256=XRMV32Sx9A1bAVMFQdBGc3tN5Xz2RfmlyKGXCzdee7A,3705
20
+ valor_lite/semantic_segmentation/annotation.py,sha256=KrDqmSVzBsutxEdh0Kl8VqcEpTe4S68UdkVg-nyxcFg,4025
21
21
  valor_lite/semantic_segmentation/benchmark.py,sha256=uxd0SiDY3npsgU5pdeT4HvNP_au9GVRWzoqT6br9DtM,5961
22
22
  valor_lite/semantic_segmentation/computation.py,sha256=ZO0qAFmq8lN73UjCyiynSv18qQDtn35FNOmvuXY4rOw,7380
23
- valor_lite/semantic_segmentation/manager.py,sha256=NAm7u1HNwPnBbZBSMX_A51f5jUB578-4ZDmBbpeAe7M,13299
23
+ valor_lite/semantic_segmentation/manager.py,sha256=h5w8Xl-O9gZxAzqT-ESofVE2th7d3cYahx4hHBic3pw,14256
24
24
  valor_lite/semantic_segmentation/metric.py,sha256=T9RfPJf4WgqGQTXYvSy08vJG5bjXXJnyYZeW0mlxMa8,7132
25
25
  valor_lite/semantic_segmentation/utilities.py,sha256=zgVmV8nyKWQK-T4Ov8cZFQzOmTKc5EL7errKFvc2H0g,2957
26
26
  valor_lite/text_generation/__init__.py,sha256=pGhpWCSZjLM0pPHCtPykAfos55B8ie3mi9EzbNxfj-U,356
@@ -35,7 +35,7 @@ valor_lite/text_generation/llm/instructions.py,sha256=fz2onBZZWcl5W8iy7zEWkPGU9N
35
35
  valor_lite/text_generation/llm/integrations.py,sha256=-rTfdAjq1zH-4ixwYuMQEOQ80pIFzMTe0BYfroVx3Pg,6974
36
36
  valor_lite/text_generation/llm/utilities.py,sha256=bjqatGgtVTcl1PrMwiDKTYPGJXKrBrx7PDtzIblGSys,1178
37
37
  valor_lite/text_generation/llm/validators.py,sha256=Wzr5RlfF58_2wOU-uTw7C8skan_fYdhy4Gfn0jSJ8HM,2700
38
- valor_lite-0.36.3.dist-info/METADATA,sha256=My77v0oKGoLJuhNu26YD_Q2dKJGTLTbmsJtYGwGDomA,5071
39
- valor_lite-0.36.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
40
- valor_lite-0.36.3.dist-info/top_level.txt,sha256=9ujykxSwpl2Hu0_R95UQTR_l07k9UUTSdrpiqmq6zc4,11
41
- valor_lite-0.36.3.dist-info/RECORD,,
38
+ valor_lite-0.36.5.dist-info/METADATA,sha256=Ttur0Z2wqHuaN6cOYousNZUqBL9A9qZFEnZejPSFRdo,5071
39
+ valor_lite-0.36.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
40
+ valor_lite-0.36.5.dist-info/top_level.txt,sha256=9ujykxSwpl2Hu0_R95UQTR_l07k9UUTSdrpiqmq6zc4,11
41
+ valor_lite-0.36.5.dist-info/RECORD,,