validmind 2.6.9__py3-none-any.whl → 2.7.2__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.
- validmind/__init__.py +2 -0
- validmind/__version__.py +1 -1
- validmind/tests/load.py +1 -1
- validmind/tests/model_validation/sklearn/ROCCurve.py +26 -23
- validmind/tests/output.py +10 -1
- validmind/tests/run.py +29 -2
- validmind/utils.py +11 -0
- validmind/vm_models/figure.py +15 -0
- validmind/vm_models/result/__init__.py +2 -2
- validmind/vm_models/result/result.py +118 -6
- {validmind-2.6.9.dist-info → validmind-2.7.2.dist-info}/METADATA +1 -1
- {validmind-2.6.9.dist-info → validmind-2.7.2.dist-info}/RECORD +15 -15
- {validmind-2.6.9.dist-info → validmind-2.7.2.dist-info}/LICENSE +0 -0
- {validmind-2.6.9.dist-info → validmind-2.7.2.dist-info}/WHEEL +0 -0
- {validmind-2.6.9.dist-info → validmind-2.7.2.dist-info}/entry_points.txt +0 -0
validmind/__init__.py
CHANGED
@@ -50,6 +50,7 @@ from .client import ( # noqa: E402
|
|
50
50
|
run_test_suite,
|
51
51
|
)
|
52
52
|
from .tests.decorator import tags, tasks, test
|
53
|
+
from .vm_models.result import RawData
|
53
54
|
|
54
55
|
__all__ = [ # noqa
|
55
56
|
"__version__",
|
@@ -62,6 +63,7 @@ __all__ = [ # noqa
|
|
62
63
|
"init_model",
|
63
64
|
"init_r_model",
|
64
65
|
"preview_template",
|
66
|
+
"RawData",
|
65
67
|
"reload",
|
66
68
|
"run_documentation_tests",
|
67
69
|
"run_test_suite",
|
validmind/__version__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "2.
|
1
|
+
__version__ = "2.7.2"
|
validmind/tests/load.py
CHANGED
@@ -169,7 +169,7 @@ def _pretty_list_tests(tests, truncate=True):
|
|
169
169
|
inspect.getdoc(test),
|
170
170
|
num_lines=(5 if truncate else 999999),
|
171
171
|
),
|
172
|
-
"Required Inputs": test.inputs,
|
172
|
+
"Required Inputs": list(test.inputs.keys()),
|
173
173
|
"Params": test.params,
|
174
174
|
}
|
175
175
|
for test_id, test in tests.items()
|
@@ -6,7 +6,7 @@ import numpy as np
|
|
6
6
|
import plotly.graph_objects as go
|
7
7
|
from sklearn.metrics import roc_auc_score, roc_curve
|
8
8
|
|
9
|
-
from validmind import tags, tasks
|
9
|
+
from validmind import RawData, tags, tasks
|
10
10
|
from validmind.errors import SkipTestError
|
11
11
|
from validmind.vm_models import VMDataset, VMModel
|
12
12
|
|
@@ -77,28 +77,31 @@ def ROCCurve(model: VMModel, dataset: VMDataset):
|
|
77
77
|
fpr, tpr, _ = roc_curve(y_true, y_prob, drop_intermediate=False)
|
78
78
|
auc = roc_auc_score(y_true, y_prob)
|
79
79
|
|
80
|
-
return
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
80
|
+
return (
|
81
|
+
RawData(fpr=fpr, tpr=tpr, auc=auc),
|
82
|
+
go.Figure(
|
83
|
+
data=[
|
84
|
+
go.Scatter(
|
85
|
+
x=fpr,
|
86
|
+
y=tpr,
|
87
|
+
mode="lines",
|
88
|
+
name=f"ROC curve (AUC = {auc:.2f})",
|
89
|
+
line=dict(color="#DE257E"),
|
90
|
+
),
|
91
|
+
go.Scatter(
|
92
|
+
x=[0, 1],
|
93
|
+
y=[0, 1],
|
94
|
+
mode="lines",
|
95
|
+
name="Random (AUC = 0.5)",
|
96
|
+
line=dict(color="grey", dash="dash"),
|
97
|
+
),
|
98
|
+
],
|
99
|
+
layout=go.Layout(
|
100
|
+
title=f"ROC Curve for {model.input_id} on {dataset.input_id}",
|
101
|
+
xaxis=dict(title="False Positive Rate"),
|
102
|
+
yaxis=dict(title="True Positive Rate"),
|
103
|
+
width=700,
|
104
|
+
height=500,
|
88
105
|
),
|
89
|
-
go.Scatter(
|
90
|
-
x=[0, 1],
|
91
|
-
y=[0, 1],
|
92
|
-
mode="lines",
|
93
|
-
name="Random (AUC = 0.5)",
|
94
|
-
line=dict(color="grey", dash="dash"),
|
95
|
-
),
|
96
|
-
],
|
97
|
-
layout=go.Layout(
|
98
|
-
title=f"ROC Curve for {model.input_id} on {dataset.input_id}",
|
99
|
-
xaxis=dict(title="False Positive Rate"),
|
100
|
-
yaxis=dict(title="True Positive Rate"),
|
101
|
-
width=700,
|
102
|
-
height=500,
|
103
106
|
),
|
104
107
|
)
|
validmind/tests/output.py
CHANGED
@@ -15,7 +15,7 @@ from validmind.vm_models.figure import (
|
|
15
15
|
is_plotly_figure,
|
16
16
|
is_png_image,
|
17
17
|
)
|
18
|
-
from validmind.vm_models.result import ResultTable, TestResult
|
18
|
+
from validmind.vm_models.result import RawData, ResultTable, TestResult
|
19
19
|
|
20
20
|
|
21
21
|
class OutputHandler(ABC):
|
@@ -103,6 +103,14 @@ class TableOutputHandler(OutputHandler):
|
|
103
103
|
result.add_table(ResultTable(data=table_data, title=table_name or None))
|
104
104
|
|
105
105
|
|
106
|
+
class RawDataOutputHandler(OutputHandler):
|
107
|
+
def can_handle(self, item: Any) -> bool:
|
108
|
+
return isinstance(item, RawData)
|
109
|
+
|
110
|
+
def process(self, item: Any, result: TestResult) -> None:
|
111
|
+
result.raw_data = item
|
112
|
+
|
113
|
+
|
106
114
|
def process_output(item: Any, result: TestResult) -> None:
|
107
115
|
"""Process a single test output item and update the TestResult."""
|
108
116
|
handlers = [
|
@@ -110,6 +118,7 @@ def process_output(item: Any, result: TestResult) -> None:
|
|
110
118
|
MetricOutputHandler(),
|
111
119
|
FigureOutputHandler(),
|
112
120
|
TableOutputHandler(),
|
121
|
+
RawDataOutputHandler(),
|
113
122
|
]
|
114
123
|
|
115
124
|
for handler in handlers:
|
validmind/tests/run.py
CHANGED
@@ -7,7 +7,7 @@ import subprocess
|
|
7
7
|
import time
|
8
8
|
from datetime import datetime
|
9
9
|
from inspect import getdoc
|
10
|
-
from typing import Any, Dict, List, Optional, Tuple, Union
|
10
|
+
from typing import Any, Callable, Dict, List, Optional, Tuple, Union
|
11
11
|
from uuid import uuid4
|
12
12
|
|
13
13
|
from validmind import __version__
|
@@ -136,6 +136,7 @@ def build_test_result(
|
|
136
136
|
test_id: str,
|
137
137
|
inputs: Dict[str, Union[VMInput, List[VMInput]]],
|
138
138
|
params: Union[Dict[str, Any], None],
|
139
|
+
doc: str,
|
139
140
|
description: str,
|
140
141
|
generate_description: bool = True,
|
141
142
|
title: Optional[str] = None,
|
@@ -149,6 +150,7 @@ def build_test_result(
|
|
149
150
|
ref_id=ref_id,
|
150
151
|
inputs=inputs,
|
151
152
|
params=params if params else None, # None if empty dict or None
|
153
|
+
doc=doc,
|
152
154
|
)
|
153
155
|
|
154
156
|
if not isinstance(outputs, tuple):
|
@@ -199,6 +201,11 @@ def _run_composite_test(
|
|
199
201
|
if not all(result.metric is not None for result in results):
|
200
202
|
raise ValueError("All tests must return a metric when used as a composite test")
|
201
203
|
|
204
|
+
# Create composite doc from all test results
|
205
|
+
composite_doc = "\n\n".join(
|
206
|
+
[f"{test_id_to_name(result.result_id)}:\n{result.doc}" for result in results]
|
207
|
+
)
|
208
|
+
|
202
209
|
return build_test_result(
|
203
210
|
outputs=[
|
204
211
|
{
|
@@ -210,6 +217,7 @@ def _run_composite_test(
|
|
210
217
|
test_id=test_id,
|
211
218
|
inputs=results[0].inputs,
|
212
219
|
params=results[0].params,
|
220
|
+
doc=composite_doc,
|
213
221
|
description="\n\n".join(
|
214
222
|
[_test_description(result.description, num_lines=1) for result in results]
|
215
223
|
), # join truncated (first line only) test descriptions
|
@@ -261,11 +269,22 @@ def _run_comparison_test(
|
|
261
269
|
|
262
270
|
combined_outputs, combined_inputs, combined_params = combine_results(results)
|
263
271
|
|
272
|
+
if unit_metrics:
|
273
|
+
doc = "\n\n".join(
|
274
|
+
[
|
275
|
+
f"{test_id_to_name(unit_metric)}:\n{getdoc(load_test(unit_metric))}"
|
276
|
+
for unit_metric in unit_metrics
|
277
|
+
]
|
278
|
+
)
|
279
|
+
else:
|
280
|
+
doc = getdoc(load_test(test_id))
|
281
|
+
|
264
282
|
return build_test_result(
|
265
283
|
outputs=tuple(combined_outputs),
|
266
284
|
test_id=test_id,
|
267
285
|
inputs=combined_inputs,
|
268
286
|
params=combined_params,
|
287
|
+
doc=doc,
|
269
288
|
description=description,
|
270
289
|
generate_description=generate_description,
|
271
290
|
title=title,
|
@@ -283,6 +302,7 @@ def run_test(
|
|
283
302
|
show: bool = True,
|
284
303
|
generate_description: bool = True,
|
285
304
|
title: Optional[str] = None,
|
305
|
+
post_process_fn: Union[Callable[[TestResult], None], None] = None,
|
286
306
|
**kwargs,
|
287
307
|
) -> TestResult:
|
288
308
|
"""Run a ValidMind or custom test
|
@@ -306,6 +326,7 @@ def run_test(
|
|
306
326
|
show (bool, optional): Whether to display results. Defaults to True.
|
307
327
|
generate_description (bool, optional): Whether to generate a description. Defaults to True.
|
308
328
|
title (str, optional): Custom title for the test result
|
329
|
+
post_process_fn (Callable[[TestResult], None], optional): Function to post-process the test result
|
309
330
|
|
310
331
|
Returns:
|
311
332
|
TestResult: A TestResult object containing the test results
|
@@ -381,12 +402,15 @@ def run_test(
|
|
381
402
|
|
382
403
|
raw_result = test_func(**input_kwargs, **param_kwargs)
|
383
404
|
|
405
|
+
doc = getdoc(test_func)
|
406
|
+
|
384
407
|
result = build_test_result(
|
385
408
|
outputs=raw_result,
|
386
409
|
test_id=test_id,
|
387
410
|
inputs=input_kwargs,
|
388
411
|
params=param_kwargs,
|
389
|
-
|
412
|
+
doc=doc,
|
413
|
+
description=doc,
|
390
414
|
generate_description=generate_description,
|
391
415
|
title=title,
|
392
416
|
)
|
@@ -394,6 +418,9 @@ def run_test(
|
|
394
418
|
end_time = time.perf_counter()
|
395
419
|
result.metadata = _get_run_metadata(duration_seconds=end_time - start_time)
|
396
420
|
|
421
|
+
if post_process_fn:
|
422
|
+
result = post_process_fn(result)
|
423
|
+
|
397
424
|
if show:
|
398
425
|
result.show()
|
399
426
|
|
validmind/utils.py
CHANGED
@@ -168,6 +168,17 @@ class NumpyEncoder(json.JSONEncoder):
|
|
168
168
|
return super().iterencode(obj, _one_shot)
|
169
169
|
|
170
170
|
|
171
|
+
class HumanReadableEncoder(NumpyEncoder):
|
172
|
+
def __init__(self, *args, **kwargs):
|
173
|
+
super().__init__(*args, **kwargs)
|
174
|
+
# truncate ndarrays to 10 items
|
175
|
+
self.type_handlers[self.is_numpy_ndarray] = lambda obj: (
|
176
|
+
obj.tolist()[:5] + ["..."] + obj.tolist()[-5:]
|
177
|
+
if len(obj) > 10
|
178
|
+
else obj.tolist()
|
179
|
+
)
|
180
|
+
|
181
|
+
|
171
182
|
def get_full_typename(o: Any) -> Any:
|
172
183
|
"""We determine types based on type names so we don't have to import
|
173
184
|
(and therefore depend on) PyTorch, TensorFlow, etc.
|
validmind/vm_models/figure.py
CHANGED
@@ -33,6 +33,18 @@ def is_png_image(figure) -> bool:
|
|
33
33
|
return isinstance(figure, bytes)
|
34
34
|
|
35
35
|
|
36
|
+
def create_figure(
|
37
|
+
figure: Union[matplotlib.figure.Figure, go.Figure, go.FigureWidget, bytes],
|
38
|
+
key: str,
|
39
|
+
ref_id: str,
|
40
|
+
) -> "Figure":
|
41
|
+
"""Create a VM Figure object from a raw figure object"""
|
42
|
+
if is_matplotlib_figure(figure) or is_plotly_figure(figure) or is_png_image(figure):
|
43
|
+
return Figure(key=key, figure=figure, ref_id=ref_id)
|
44
|
+
|
45
|
+
raise ValueError(f"Unsupported figure type: {type(figure)}")
|
46
|
+
|
47
|
+
|
36
48
|
@dataclass
|
37
49
|
class Figure:
|
38
50
|
"""
|
@@ -55,6 +67,9 @@ class Figure:
|
|
55
67
|
):
|
56
68
|
self.figure = go.FigureWidget(self.figure)
|
57
69
|
|
70
|
+
def __repr__(self):
|
71
|
+
return f"Figure(key={self.key}, ref_id={self.ref_id})"
|
72
|
+
|
58
73
|
def to_widget(self):
|
59
74
|
"""
|
60
75
|
Returns the ipywidget compatible representation of the figure. Ideally
|
@@ -2,6 +2,6 @@
|
|
2
2
|
# See the LICENSE file in the root of this repository for details.
|
3
3
|
# SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial
|
4
4
|
|
5
|
-
from .result import ErrorResult, Result, ResultTable, TestResult
|
5
|
+
from .result import ErrorResult, RawData, Result, ResultTable, TestResult
|
6
6
|
|
7
|
-
__all__ = ["ErrorResult", "Result", "ResultTable", "TestResult"]
|
7
|
+
__all__ = ["ErrorResult", "RawData", "Result", "ResultTable", "TestResult"]
|
@@ -12,14 +12,22 @@ from dataclasses import dataclass
|
|
12
12
|
from typing import Any, Dict, List, Optional, Union
|
13
13
|
from uuid import uuid4
|
14
14
|
|
15
|
+
import matplotlib
|
15
16
|
import pandas as pd
|
17
|
+
import plotly.graph_objs as go
|
16
18
|
from ipywidgets import HTML, VBox
|
17
19
|
|
18
20
|
from ... import api_client
|
19
21
|
from ...ai.utils import DescriptionFuture
|
20
22
|
from ...logging import get_logger
|
21
|
-
from ...utils import
|
22
|
-
|
23
|
+
from ...utils import (
|
24
|
+
HumanReadableEncoder,
|
25
|
+
NumpyEncoder,
|
26
|
+
display,
|
27
|
+
run_async,
|
28
|
+
test_id_to_name,
|
29
|
+
)
|
30
|
+
from ..figure import Figure, create_figure
|
23
31
|
from ..input import VMInput
|
24
32
|
from .utils import (
|
25
33
|
AI_REVISION_NAME,
|
@@ -34,6 +42,42 @@ from .utils import (
|
|
34
42
|
logger = get_logger(__name__)
|
35
43
|
|
36
44
|
|
45
|
+
class RawData:
|
46
|
+
"""Holds raw data for a test result"""
|
47
|
+
|
48
|
+
def __init__(self, log: bool = False, **kwargs):
|
49
|
+
"""Create a new RawData object
|
50
|
+
|
51
|
+
Args:
|
52
|
+
log (bool): If True, log the raw data to ValidMind
|
53
|
+
**kwargs: Keyword arguments to set as attributes e.g.
|
54
|
+
`RawData(log=True, dataset_duplicates=df_duplicates)`
|
55
|
+
"""
|
56
|
+
self.log = log
|
57
|
+
|
58
|
+
for key, value in kwargs.items():
|
59
|
+
setattr(self, key, value)
|
60
|
+
|
61
|
+
def __repr__(self) -> str:
|
62
|
+
return f"RawData({', '.join(self.__dict__.keys())})"
|
63
|
+
|
64
|
+
def inspect(self, show: bool = True):
|
65
|
+
"""Inspect the raw data"""
|
66
|
+
raw_data = {
|
67
|
+
key: getattr(self, key)
|
68
|
+
for key in self.__dict__
|
69
|
+
if not key.startswith("_") and key != "log"
|
70
|
+
}
|
71
|
+
|
72
|
+
if not show:
|
73
|
+
return raw_data
|
74
|
+
|
75
|
+
print(json.dumps(raw_data, indent=2, cls=HumanReadableEncoder))
|
76
|
+
|
77
|
+
def serialize(self):
|
78
|
+
return {key: getattr(self, key) for key in self.__dict__}
|
79
|
+
|
80
|
+
|
37
81
|
@dataclass
|
38
82
|
class ResultTable:
|
39
83
|
"""
|
@@ -41,7 +85,7 @@ class ResultTable:
|
|
41
85
|
"""
|
42
86
|
|
43
87
|
data: Union[List[Any], pd.DataFrame]
|
44
|
-
title: str
|
88
|
+
title: Optional[str] = None
|
45
89
|
|
46
90
|
def __repr__(self) -> str:
|
47
91
|
return f'ResultTable(title="{self.title}")' if self.title else "ResultTable"
|
@@ -115,15 +159,16 @@ class TestResult(Result):
|
|
115
159
|
name: str = "Test Result"
|
116
160
|
ref_id: str = None
|
117
161
|
title: Optional[str] = None
|
162
|
+
doc: Optional[str] = None
|
118
163
|
description: Optional[Union[str, DescriptionFuture]] = None
|
119
164
|
metric: Optional[Union[int, float]] = None
|
120
165
|
tables: Optional[List[ResultTable]] = None
|
166
|
+
raw_data: Optional[RawData] = None
|
121
167
|
figures: Optional[List[Figure]] = None
|
122
168
|
passed: Optional[bool] = None
|
123
169
|
params: Optional[Dict[str, Any]] = None
|
124
170
|
inputs: Optional[Dict[str, Union[List[VMInput], VMInput]]] = None
|
125
171
|
metadata: Optional[Dict[str, Any]] = None
|
126
|
-
title: Optional[str] = None
|
127
172
|
_was_description_generated: bool = False
|
128
173
|
_unsafe: bool = False
|
129
174
|
|
@@ -136,6 +181,7 @@ class TestResult(Result):
|
|
136
181
|
attrs = [
|
137
182
|
attr
|
138
183
|
for attr in [
|
184
|
+
"doc",
|
139
185
|
"description",
|
140
186
|
"params",
|
141
187
|
"tables",
|
@@ -144,6 +190,11 @@ class TestResult(Result):
|
|
144
190
|
"passed",
|
145
191
|
]
|
146
192
|
if getattr(self, attr) is not None
|
193
|
+
and (
|
194
|
+
len(getattr(self, attr)) > 0
|
195
|
+
if isinstance(getattr(self, attr), list)
|
196
|
+
else True
|
197
|
+
)
|
147
198
|
]
|
148
199
|
|
149
200
|
return f'TestResult("{self.result_id}", {", ".join(attrs)})'
|
@@ -164,21 +215,82 @@ class TestResult(Result):
|
|
164
215
|
|
165
216
|
return list(inputs.values())
|
166
217
|
|
167
|
-
def add_table(
|
218
|
+
def add_table(
|
219
|
+
self,
|
220
|
+
table: Union[ResultTable, pd.DataFrame, List[Dict[str, Any]]],
|
221
|
+
title: Optional[str] = None,
|
222
|
+
):
|
223
|
+
"""Add a new table to the result
|
224
|
+
|
225
|
+
Args:
|
226
|
+
table (Union[ResultTable, pd.DataFrame, List[Dict[str, Any]]]): The table to add
|
227
|
+
title (Optional[str]): The title of the table (can optionally be provided for
|
228
|
+
pd.DataFrame and List[Dict[str, Any]] tables)
|
229
|
+
"""
|
168
230
|
if self.tables is None:
|
169
231
|
self.tables = []
|
170
232
|
|
233
|
+
if isinstance(table, (pd.DataFrame, list)):
|
234
|
+
table = ResultTable(data=table, title=title)
|
235
|
+
|
171
236
|
self.tables.append(table)
|
172
237
|
|
173
|
-
def
|
238
|
+
def remove_table(self, index: int):
|
239
|
+
"""Remove a table from the result by index
|
240
|
+
|
241
|
+
Args:
|
242
|
+
index (int): The index of the table to remove (default is 0)
|
243
|
+
"""
|
244
|
+
if self.tables is None:
|
245
|
+
return
|
246
|
+
|
247
|
+
self.tables.pop(index)
|
248
|
+
|
249
|
+
def add_figure(
|
250
|
+
self,
|
251
|
+
figure: Union[
|
252
|
+
matplotlib.figure.Figure,
|
253
|
+
go.Figure,
|
254
|
+
go.FigureWidget,
|
255
|
+
bytes,
|
256
|
+
Figure,
|
257
|
+
],
|
258
|
+
):
|
259
|
+
"""Add a new figure to the result
|
260
|
+
|
261
|
+
Args:
|
262
|
+
figure (Union[matplotlib.figure.Figure, go.Figure, go.FigureWidget,
|
263
|
+
bytes, Figure]): The figure to add (can be either a VM Figure object,
|
264
|
+
a raw figure object from the supported libraries, or a png image as
|
265
|
+
raw bytes)
|
266
|
+
"""
|
174
267
|
if self.figures is None:
|
175
268
|
self.figures = []
|
176
269
|
|
270
|
+
if not isinstance(figure, Figure):
|
271
|
+
random_tag = str(uuid4())[:4]
|
272
|
+
figure = create_figure(
|
273
|
+
figure=figure,
|
274
|
+
ref_id=self.ref_id,
|
275
|
+
key=f"{self.result_id}:{random_tag}",
|
276
|
+
)
|
277
|
+
|
177
278
|
if figure.ref_id != self.ref_id:
|
178
279
|
figure.ref_id = self.ref_id
|
179
280
|
|
180
281
|
self.figures.append(figure)
|
181
282
|
|
283
|
+
def remove_figure(self, index: int = 0):
|
284
|
+
"""Remove a figure from the result by index
|
285
|
+
|
286
|
+
Args:
|
287
|
+
index (int): The index of the figure to remove (default is 0)
|
288
|
+
"""
|
289
|
+
if self.figures is None:
|
290
|
+
return
|
291
|
+
|
292
|
+
self.figures.pop(index)
|
293
|
+
|
182
294
|
def to_widget(self):
|
183
295
|
if isinstance(self.description, DescriptionFuture):
|
184
296
|
self.description = self.description.get_description()
|
@@ -1,5 +1,5 @@
|
|
1
|
-
validmind/__init__.py,sha256=
|
2
|
-
validmind/__version__.py,sha256=
|
1
|
+
validmind/__init__.py,sha256=U-S6pV31O3sVsbcEzlriz0tootyfvPnPOu4PHzXz9tM,2688
|
2
|
+
validmind/__version__.py,sha256=H1WLrviWKvrPzDle8EWdCYYkzljxs0mtbXigYc-xaKA,22
|
3
3
|
validmind/ai/test_descriptions.py,sha256=IlnRSNqbddpVbWoPldPrlpFldn0hGUsKUp0RBixu6j4,6914
|
4
4
|
validmind/ai/test_result_description/config.yaml,sha256=E1gPd-uv-MzdrWZA_rP6LSk8pVmkYijx6v78hZ8ceL0,787
|
5
5
|
validmind/ai/test_result_description/context.py,sha256=ebKulFMpXTDLqd6lOHAsG200GmLNnhnu7sMDnbo2Dhc,2339
|
@@ -166,7 +166,7 @@ validmind/tests/data_validation/nlp/TextDescription.py,sha256=k9PVKKiCDAKwj2uj_O
|
|
166
166
|
validmind/tests/data_validation/nlp/Toxicity.py,sha256=VyOeN2yR2OMXoaj_pBeBX5LfvgR4OdTJQe8nPEamD5A,2682
|
167
167
|
validmind/tests/data_validation/nlp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
168
168
|
validmind/tests/decorator.py,sha256=0SxG1RBZ9h7ZBF1863hD_iqwlvff0EioTzt9xfW-Qfw,4797
|
169
|
-
validmind/tests/load.py,sha256=
|
169
|
+
validmind/tests/load.py,sha256=V-bWhCc4cR5RYpnohKOccq4r5AOO53cr-B3qpp6mTwE,10943
|
170
170
|
validmind/tests/model_validation/BertScore.py,sha256=nRR8lmY2ELBJlqVzKFNnOBgWOu3p27gciVb1zP85vCQ,5719
|
171
171
|
validmind/tests/model_validation/BleuScore.py,sha256=W6XMg8aO_L09REQ3fI3w6cEZZ1MYxTMzlpXDEAApSL0,5096
|
172
172
|
validmind/tests/model_validation/ClusterSizeDistribution.py,sha256=e0yNcSneM8gm1Yd1ownCyOmpt1NAYWjAwUQfKDEiPYQ,3240
|
@@ -230,7 +230,7 @@ validmind/tests/model_validation/sklearn/OverfitDiagnosis.py,sha256=JM2HHEHyKIgT
|
|
230
230
|
validmind/tests/model_validation/sklearn/PermutationFeatureImportance.py,sha256=PaBsCye7mN_ZaxfoqLD07XnmkxU8Juc5V6K9tpklYUA,4094
|
231
231
|
validmind/tests/model_validation/sklearn/PopulationStabilityIndex.py,sha256=qBmU4TDMAJGABzNI8VbZod59G3YbdzfU7qz76eqga1U,8793
|
232
232
|
validmind/tests/model_validation/sklearn/PrecisionRecallCurve.py,sha256=waA_A0qjxta20wycjTl-QYHGx5CUb5c0Zdczk3LyBkY,3665
|
233
|
-
validmind/tests/model_validation/sklearn/ROCCurve.py,sha256=
|
233
|
+
validmind/tests/model_validation/sklearn/ROCCurve.py,sha256=StpBXzqpw5G-V-Kfj-Wx5NzyDEwJ8h95o2-uECB5t4I,4876
|
234
234
|
validmind/tests/model_validation/sklearn/RegressionErrors.py,sha256=qj6l5RQGG7E6aOcaFxO8WReEEdJKfXrNp7wecWuCSaI,3713
|
235
235
|
validmind/tests/model_validation/sklearn/RegressionErrorsComparison.py,sha256=em0NPWZVKq-nqdbFiiifQcsONGd8xek0_kwdtx6HXjE,3609
|
236
236
|
validmind/tests/model_validation/sklearn/RegressionPerformance.py,sha256=IJOjUWJMTn_-8XM8MsLAtkkQtFhP4PT-AVX90Z_V35M,3193
|
@@ -264,7 +264,7 @@ validmind/tests/ongoing_monitoring/FeatureDrift.py,sha256=qsBoolRGgW6sdUa8F-c4gs
|
|
264
264
|
validmind/tests/ongoing_monitoring/PredictionAcrossEachFeature.py,sha256=QDaYzf2b3n4yU_Rq3kBRJA49jIl1RP-n2d4KikZ76_c,3323
|
265
265
|
validmind/tests/ongoing_monitoring/PredictionCorrelation.py,sha256=15GqFODz986m0c-62fc1UffSRLndGv4WiB2Uz503zak,3449
|
266
266
|
validmind/tests/ongoing_monitoring/TargetPredictionDistributionPlot.py,sha256=KVJvMGpNg0fsCJ9ZkUmlRZ-L1Gy9xLj1YS_C-p5bsXc,2498
|
267
|
-
validmind/tests/output.py,sha256=
|
267
|
+
validmind/tests/output.py,sha256=1kY9FJWUOpZ2BofxKQ5scxkg10Pvb24_OxypegHeh04,4029
|
268
268
|
validmind/tests/prompt_validation/Bias.py,sha256=UFtC7l8aXBkyzfpvZ2db2JlO5SZOssp2mCrUk5HKyTY,5702
|
269
269
|
validmind/tests/prompt_validation/Clarity.py,sha256=KA1hFtsUHO02epDEIc4W1LtuU3BoXCg3xkQsuIUKeuI,4825
|
270
270
|
validmind/tests/prompt_validation/Conciseness.py,sha256=pZaMfKELAfTp3apUsQ1Pi53LUGMBetyHOt5DaqLcrUY,4591
|
@@ -274,7 +274,7 @@ validmind/tests/prompt_validation/Robustness.py,sha256=exMGzdzAtfRSTVSSY4xhbidln
|
|
274
274
|
validmind/tests/prompt_validation/Specificity.py,sha256=B5XemQSoE2o6elSFZZ5NdWq0ie3NycZS_CTTSThopfM,4692
|
275
275
|
validmind/tests/prompt_validation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
276
276
|
validmind/tests/prompt_validation/ai_powered_test.py,sha256=Lc8WU-rJ50e_NbLGV3YZ-W9t6Vj2T-o7hMxZbUrv3pw,2229
|
277
|
-
validmind/tests/run.py,sha256=
|
277
|
+
validmind/tests/run.py,sha256=Vz654OtevNM5r_OaFS052tAZZwhj2HGgFWGZ6DEj5Pw,14418
|
278
278
|
validmind/tests/test_providers.py,sha256=BceVuM_-bfQ4Zp-a5wwcP_wHeM6IOUpPIq1-MeT2-VY,6250
|
279
279
|
validmind/tests/utils.py,sha256=mQuf1qgewPiE_pFN8iOoPSCGdyFqb4jbMFBVN3S3S2o,3526
|
280
280
|
validmind/unit_metrics/__init__.py,sha256=lXeTJh8uq0TBRQHDBVhzKiHoV2eG9xOkHkI_pDXnkPU,952
|
@@ -294,24 +294,24 @@ validmind/unit_metrics/regression/MeanSquaredError.py,sha256=h-zgtlR3aigQwMGbi55
|
|
294
294
|
validmind/unit_metrics/regression/QuantileLoss.py,sha256=rs0m9w4zIL6daQOHqYY-sEeQs6SDTpd0t3cN_KFZyqA,518
|
295
295
|
validmind/unit_metrics/regression/RSquaredScore.py,sha256=z8-E-KSewvma9nu1OSUv97IfmFLpV5-rOq15jtlxklg,459
|
296
296
|
validmind/unit_metrics/regression/RootMeanSquaredError.py,sha256=uIDsSpy75Z7W3zu4LditvW3mPJIkGxf-PdFQ7szWBZU,603
|
297
|
-
validmind/utils.py,sha256=
|
297
|
+
validmind/utils.py,sha256=rS7XEiNwcaWzWrAEBlJEUVfOb7FD55LuXlY8-0XZro4,18117
|
298
298
|
validmind/vm_models/__init__.py,sha256=lcqf9q2aRzrVrNN6R--81IkrnSa6BXPbhJ8SnkT_hcI,702
|
299
299
|
validmind/vm_models/dataset/__init__.py,sha256=U4CxZjdoc0dd9u2AqBl5PJh1UVbzXWNrmundmjLF-qE,346
|
300
300
|
validmind/vm_models/dataset/dataset.py,sha256=Zzquc3FhPGTMZhFxNlAIHf4AGXq5idpJmr-fkXUpi6A,26498
|
301
301
|
validmind/vm_models/dataset/utils.py,sha256=VMcPEgwW9oW5D0MCa_MqXCq_sEzzsLLRmS4RaYrsif0,5530
|
302
|
-
validmind/vm_models/figure.py,sha256=
|
302
|
+
validmind/vm_models/figure.py,sha256=7VNOIsbOsUKyXvgxaY10H_Wvy2HEFte3nwdx09SZu20,6297
|
303
303
|
validmind/vm_models/input.py,sha256=qLdqz_bktr4v0YcPha2vFdDvmkC-btT1pH9zBIkt1OY,1046
|
304
304
|
validmind/vm_models/model.py,sha256=PRNyrnKihIRtbYt4idLPHf8OCij71Vgc5Xug_oVZfBg,6486
|
305
|
-
validmind/vm_models/result/__init__.py,sha256=
|
305
|
+
validmind/vm_models/result/__init__.py,sha256=Bs5GMGDxiTsxlwCdqxz5LmGkY0_fM6-_0-3tWSRoqps,341
|
306
306
|
validmind/vm_models/result/result.jinja,sha256=Yvovwm5gInCBukFRlvJXNlDIUpl2eFz4dz1lS3Sn_Gc,311
|
307
|
-
validmind/vm_models/result/result.py,sha256=
|
307
|
+
validmind/vm_models/result/result.py,sha256=v7sT6iadOTNii5DdD92FI1cUuEo1-VP7z6YQAMpAl1I,13785
|
308
308
|
validmind/vm_models/result/utils.py,sha256=t6g-g1fJ3SU9lHqC1kMeozMkrUnfOMwYAep3Z5XFXNo,5122
|
309
309
|
validmind/vm_models/test_suite/runner.py,sha256=Cpl9WKwHzJD5Zvrh71FzbEhGZkHM0x0MSd4PIwdOLDQ,5427
|
310
310
|
validmind/vm_models/test_suite/summary.py,sha256=Ug3nMvpPL2DSTDujWagWMCrFiW9oDy0AqJL_zXN8pH0,4642
|
311
311
|
validmind/vm_models/test_suite/test.py,sha256=uImjmPlBlLrlVPavsUzbaDK55bvpOn3PuFyWeyYyTac,3908
|
312
312
|
validmind/vm_models/test_suite/test_suite.py,sha256=5Jppt2UXSMgvJ6FO5LIAKA4oN_-hh9SMr8APAFJzk9g,5080
|
313
|
-
validmind-2.
|
314
|
-
validmind-2.
|
315
|
-
validmind-2.
|
316
|
-
validmind-2.
|
317
|
-
validmind-2.
|
313
|
+
validmind-2.7.2.dist-info/LICENSE,sha256=XonPUfwjvrC5Ombl3y-ko0Wubb1xdG_7nzvIbkZRKHw,35772
|
314
|
+
validmind-2.7.2.dist-info/METADATA,sha256=m0NFeDGlKjU5PvjtmjpfBLtDnxGz4HmS30Z5NgKehxA,6124
|
315
|
+
validmind-2.7.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
316
|
+
validmind-2.7.2.dist-info/entry_points.txt,sha256=HuW7YyOv9u_OEWpViQXtv0nfoI67uieJHawKWA4Hv9A,76
|
317
|
+
validmind-2.7.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|