Skip to content

Commit 171b97e

Browse files
authored
Fix/doctests for modules (#71)
* stage progress * finish * fix minor mistake * misc changes * implement doctests cleanup * fix some doctests
1 parent 42b3280 commit 171b97e

File tree

19 files changed

+269
-288
lines changed

19 files changed

+269
-288
lines changed

autointent/_pipeline/_pipeline.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@
1212
from autointent import Context, Dataset
1313
from autointent.configs import EmbedderConfig, InferenceNodeConfig, LoggingConfig, VectorIndexConfig
1414
from autointent.custom_types import NodeType
15-
from autointent.nodes import NodeOptimizer
16-
from autointent.nodes.inference import InferenceNode
15+
from autointent.nodes import InferenceNode, NodeOptimizer
1716
from autointent.utils import load_default_search_space, load_search_space
1817

1918
from ._schemas import InferencePipelineOutput, InferencePipelineUtteranceOutput

autointent/context/vector_index_client/_vector_index.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ def query(
172172
all_results = func(queries, k) # type: ignore[arg-type]
173173

174174
all_labels = [[self.labels[result["id"]] for result in results] for results in all_results]
175-
all_distances = [[result["distance"] for result in results] for results in all_results]
175+
all_distances = [[float(result["distance"]) for result in results] for results in all_results]
176176
all_texts = [[self.texts[result["id"]] for result in results] for results in all_results]
177177

178178
return all_labels, all_distances, all_texts

autointent/custom_types.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ class LogLevel(Enum):
2121
# Literal type for weight types in specific operations
2222
WEIGHT_TYPES = Literal["uniform", "distance", "closest"]
2323
"""
24-
Represents weight calculation methods:
24+
Represents weight calculation methods
25+
2526
- "uniform": Equal weight for all elements.
2627
- "distance": Weights based on distance.
2728
- "closest": Prioritizes closest elements.
@@ -30,7 +31,8 @@ class LogLevel(Enum):
3031
# Type alias for label representation
3132
LabelType = int | list[int]
3233
"""
33-
Type alias for label representation:
34+
Type alias for label representation
35+
3436
- `int`: For single-label classification.
3537
- `list[int]`: For multi-label classification.
3638
"""

autointent/modules/prediction/_adaptive.py

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -47,26 +47,22 @@ class AdaptivePredictor(PredictionModule):
4747
4848
Examples
4949
--------
50-
>>> from autointent.modules import AdaptivePredictor
51-
>>> import numpy as np
52-
>>> scores = np.array([[0.8, 0.1, 0.4], [0.2, 0.9, 0.5]])
53-
>>> labels = [[1, 0, 0], [0, 1, 0]]
54-
>>> search_space = [0.1, 0.2, 0.3, 0.5, 0.7]
55-
>>> predictor = AdaptivePredictor(search_space=search_space)
56-
>>> predictor.fit(scores, labels)
57-
>>> predictions = predictor.predict(scores)
58-
>>> print(predictions)
59-
[[1 0 0]
60-
[0 1 0]]
61-
62-
Save and load the predictor:
63-
>>> predictor.dump("outputs/")
64-
>>> predictor_loaded = AdaptivePredictor()
65-
>>> predictor_loaded.load("outputs/")
66-
>>> predictions = predictor_loaded.predict(scores)
67-
>>> print(predictions)
68-
[[1 0 0]
69-
[0 1 0]]
50+
.. testcode::
51+
52+
from autointent.modules.prediction import AdaptivePredictor
53+
import numpy as np
54+
scores = np.array([[0.8, 0.1, 0.4], [0.2, 0.9, 0.5]])
55+
labels = [[1, 0, 0], [0, 1, 0]]
56+
predictor = AdaptivePredictor()
57+
predictor.fit(scores, labels)
58+
predictions = predictor.predict(scores)
59+
print(predictions)
60+
61+
.. testoutput::
62+
63+
[[1 0 0]
64+
[0 1 0]]
65+
7066
"""
7167

7268
metadata_dict_name = "metadata.json"

autointent/modules/prediction/_argmax.py

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,24 +32,22 @@ class ArgmaxPredictor(PredictionModule):
3232
3333
Examples
3434
--------
35-
>>> from autointent.modules import ArgmaxPredictor
36-
>>> import numpy as np
37-
>>> predictor = ArgmaxPredictor()
38-
>>> train_scores = np.array([[0.2, 0.8, 0.0], [0.7, 0.1, 0.2]])
39-
>>> labels = [1, 0] # Single-label targets
40-
>>> predictor.fit(train_scores, labels)
41-
>>> test_scores = np.array([[0.1, 0.5, 0.4], [0.6, 0.3, 0.1]])
42-
>>> predictions = predictor.predict(test_scores)
43-
>>> print(predictions)
44-
[1 0]
45-
46-
Save the predictor's state:
47-
>>> predictor.dump("outputs/")
48-
>>> loaded_predictor = ArgmaxPredictor()
49-
>>> loaded_predictor.load("outputs/")
50-
>>> loaded_predictions = loaded_predictor.predict(test_scores)
51-
>>> print(loaded_predictions)
52-
[1 0]
35+
.. testcode::
36+
37+
from autointent.modules import ArgmaxPredictor
38+
import numpy as np
39+
predictor = ArgmaxPredictor()
40+
train_scores = np.array([[0.2, 0.8, 0.0], [0.7, 0.1, 0.2]])
41+
labels = [1, 0] # Single-label targets
42+
predictor.fit(train_scores, labels)
43+
test_scores = np.array([[0.1, 0.5, 0.4], [0.6, 0.3, 0.1]])
44+
predictions = predictor.predict(test_scores)
45+
print(predictions)
46+
47+
.. testoutput::
48+
49+
[1 0]
50+
5351
"""
5452

5553
name = "argmax"

autointent/modules/prediction/_jinoos.py

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,24 +37,23 @@ class JinoosPredictor(PredictionModule):
3737
3838
Examples
3939
--------
40-
>>> from autointent.modules import JinoosPredictor
41-
>>> import numpy as np
42-
>>> scores = np.array([[0.2, 0.8], [0.6, 0.4], [0.1, 0.9]])
43-
>>> labels = [1, 0, 1]
44-
>>> search_space = [0.3, 0.5, 0.7]
45-
>>> predictor = JinoosPredictor(search_space=search_space)
46-
>>> predictor.fit(scores, labels)
47-
>>> test_scores = np.array([[0.3, 0.7], [0.5, 0.5]])
48-
>>> predictions = predictor.predict(test_scores)
49-
>>> print(predictions)
50-
[1 0]
51-
52-
Save and load the predictor state:
53-
>>> predictor.dump("outputs/")
54-
>>> loaded_predictor = JinoosPredictor()
55-
>>> loaded_predictor.load("outputs/")
56-
>>> print(loaded_predictor.thresh)
57-
0.5 # Example threshold from the search space
40+
.. testcode::
41+
42+
from autointent.modules import JinoosPredictor
43+
import numpy as np
44+
scores = np.array([[0.2, 0.8], [0.6, 0.4], [0.1, 0.9]])
45+
labels = [1, 0, 1]
46+
search_space = [0.3, 0.5, 0.7]
47+
predictor = JinoosPredictor(search_space=search_space)
48+
predictor.fit(scores, labels)
49+
test_scores = np.array([[0.3, 0.7], [0.5, 0.5]])
50+
predictions = predictor.predict(test_scores)
51+
print(predictions)
52+
53+
.. testoutput::
54+
55+
[1 0]
56+
5857
"""
5958

6059
thresh: float

autointent/modules/prediction/_threshold.py

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -42,34 +42,41 @@ class ThresholdPredictor(PredictionModule):
4242
4343
Examples
4444
--------
45-
Single-label classification example:
46-
>>> from autointent.modules import ThresholdPredictor
47-
>>> import numpy as np
48-
>>> scores = np.array([[0.2, 0.8], [0.6, 0.4], [0.1, 0.9]])
49-
>>> labels = [1, 0, 1]
50-
>>> threshold = 0.5
51-
>>> predictor = ThresholdPredictor(thresh=threshold)
52-
>>> predictor.fit(scores, labels)
53-
>>> test_scores = np.array([[0.3, 0.7], [0.5, 0.5]])
54-
>>> predictions = predictor.predict(test_scores)
55-
>>> print(predictions)
56-
[1 0]
57-
58-
Multi-label classification example:
59-
>>> labels = [[1, 0], [0, 1], [1, 1]]
60-
>>> predictor = ThresholdPredictor(thresh=[0.5, 0.5])
61-
>>> predictor.fit(scores, labels)
62-
>>> test_scores = np.array([[0.3, 0.7], [0.6, 0.4]])
63-
>>> predictions = predictor.predict(test_scores)
64-
>>> print(predictions)
65-
[[0 1] [1 0]]
66-
67-
Save and load the model:
68-
>>> predictor.dump("outputs/")
69-
>>> loaded_predictor = ThresholdPredictor(thresh=0.5)
70-
>>> loaded_predictor.load("outputs/")
71-
>>> print(loaded_predictor.thresh)
72-
0.5
45+
Single-label classification
46+
===========================
47+
.. testcode::
48+
49+
from autointent.modules import ThresholdPredictor
50+
import numpy as np
51+
scores = np.array([[0.2, 0.8], [0.6, 0.4], [0.1, 0.9]])
52+
labels = [1, 0, 1]
53+
threshold = 0.5
54+
predictor = ThresholdPredictor(thresh=threshold)
55+
predictor.fit(scores, labels)
56+
test_scores = np.array([[0.3, 0.7], [0.5, 0.5]])
57+
predictions = predictor.predict(test_scores)
58+
print(predictions)
59+
60+
.. testoutput::
61+
62+
[1 0]
63+
64+
Multi-label classification
65+
==========================
66+
.. testcode::
67+
68+
labels = [[1, 0], [0, 1], [1, 1]]
69+
predictor = ThresholdPredictor(thresh=[0.5, 0.5])
70+
predictor.fit(scores, labels)
71+
test_scores = np.array([[0.3, 0.7], [0.6, 0.4]])
72+
predictions = predictor.predict(test_scores)
73+
print(predictions)
74+
75+
.. testoutput::
76+
77+
[[0 1]
78+
[1 0]]
79+
7380
"""
7481

7582
metadata: ThresholdPredictorDumpMetadata

autointent/modules/prediction/_tunable.py

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -43,33 +43,40 @@ class TunablePredictor(PredictionModule):
4343
4444
Examples
4545
--------
46-
Single-label classification:
47-
>>> import numpy as np
48-
>>> from autointent.modules import TunablePredictor
49-
>>> scores = np.array([[0.2, 0.8], [0.6, 0.4], [0.1, 0.9]])
50-
>>> labels = [1, 0, 1]
51-
>>> predictor = TunablePredictor(n_trials=100, seed=42)
52-
>>> predictor.fit(scores, labels)
53-
>>> test_scores = np.array([[0.3, 0.7], [0.5, 0.5]])
54-
>>> predictions = predictor.predict(test_scores)
55-
>>> print(predictions)
56-
[1 0]
57-
58-
Multi-label classification:
59-
>>> labels = [[1, 0], [0, 1], [1, 1]]
60-
>>> predictor = TunablePredictor(n_trials=100, seed=42)
61-
>>> predictor.fit(scores, labels)
62-
>>> test_scores = np.array([[0.3, 0.7], [0.6, 0.4]])
63-
>>> predictions = predictor.predict(test_scores)
64-
>>> print(predictions)
65-
[[0 1] [1 0]]
66-
67-
Saving and loading the model:
68-
>>> predictor.dump("outputs/")
69-
>>> loaded_predictor = TunablePredictor()
70-
>>> loaded_predictor.load("outputs/")
71-
>>> print(loaded_predictor.thresh)
72-
[0.5, 0.7]
46+
Single-label classification
47+
===========================
48+
.. testcode::
49+
50+
import numpy as np
51+
from autointent.modules import TunablePredictor
52+
scores = np.array([[0.2, 0.8], [0.6, 0.4], [0.1, 0.9]])
53+
labels = [1, 0, 1]
54+
predictor = TunablePredictor(n_trials=100, seed=42)
55+
predictor.fit(scores, labels)
56+
test_scores = np.array([[0.3, 0.7], [0.5, 0.5]])
57+
predictions = predictor.predict(test_scores)
58+
print(predictions)
59+
60+
.. testoutput::
61+
62+
[1 0]
63+
64+
Multi-label classification
65+
==========================
66+
.. testcode::
67+
68+
labels = [[1, 0], [0, 1], [1, 1]]
69+
predictor = TunablePredictor(n_trials=100, seed=42)
70+
predictor.fit(scores, labels)
71+
test_scores = np.array([[0.3, 0.7], [0.6, 0.4]])
72+
predictions = predictor.predict(test_scores)
73+
print(predictions)
74+
75+
.. testoutput::
76+
77+
[[1 1]
78+
[1 1]]
79+
7380
"""
7481

7582
name = "tunable"

autointent/modules/retrieval/_vectordb.py

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -32,28 +32,33 @@ class VectorDBModule(RetrievalModule):
3232
3333
Examples
3434
--------
35-
Creating and fitting the VectorDBModule:
36-
>>> from your_module import VectorDBModule
37-
>>> utterances = ["hello world", "how are you?", "good morning"]
38-
>>> labels = [1, 2, 3]
39-
>>> vector_db = VectorDBModule(k=2, embedder_name="some_embedder", db_dir="./db", device="cpu")
40-
>>> vector_db.fit(utterances, labels)
41-
>>> def retrieval_metric_fn(true_labels, predicted_labels):
42-
>>> # Custom metric function (e.g., accuracy or F1 score)
43-
>>> return sum([1 if true == pred else 0 for true, pred \\
44-
>>> in zip(true_labels, predicted_labels)]) / len(true_labels)
45-
>>> score = vector_db.score(context, retrieval_metric_fn)
46-
>>> print(score)
47-
48-
Performing predictions:
49-
>>> predictions = vector_db.predict(["how is the weather today?"])
50-
>>> print(predictions)
51-
52-
Saving and loading the model:
53-
>>> vector_db.dump("outputs/")
54-
>>> loaded_vector_db = VectorDBModule(k=2, embedder_name="some_embedder", db_dir="./db", device="cpu")
55-
>>> loaded_vector_db.load("outputs/")
56-
>>> print(loaded_vector_db.vector_index)
35+
.. testsetup::
36+
37+
db_dir = "doctests-db"
38+
39+
.. testcode::
40+
41+
from autointent.modules.retrieval import VectorDBModule
42+
utterances = ["bye", "how are you?", "good morning"]
43+
labels = [0, 1, 1]
44+
vector_db = VectorDBModule(
45+
k=2,
46+
embedder_name="sergeyzh/rubert-tiny-turbo",
47+
db_dir=db_dir,
48+
)
49+
vector_db.fit(utterances, labels)
50+
predictions = vector_db.predict(["how is the weather today?"])
51+
print(predictions)
52+
53+
.. testoutput::
54+
55+
([[1, 1]], [[0.1525942087173462, 0.18616724014282227]], [['good morning', 'how are you?']])
56+
57+
.. testcleanup::
58+
59+
import shutil
60+
shutil.rmtree(db_dir)
61+
5762
"""
5863

5964
vector_index: VectorIndex

autointent/modules/scoring/_description/description.py

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,24 +40,6 @@ class DescriptionScorer(ScoringModule):
4040
:ivar db_dir: Directory path where the vector database is stored.
4141
:ivar name: Name of the scorer, defaults to "description".
4242
43-
Examples
44-
--------
45-
Creating and fitting the DescriptionScorer
46-
>>> from autointent.modules import DescriptionScorer
47-
>>> utterances = ["what is your name?", "how old are you?"]
48-
>>> labels = [0, 1]
49-
>>> descriptions = ["greeting", "age-related question"]
50-
>>> scorer = DescriptionScorer(embedder_name="your_embedder", temperature=1.0)
51-
>>> scorer.fit(utterances, labels, descriptions)
52-
53-
Predicting scores:
54-
>>> scores = scorer.predict(["tell me about your age?"])
55-
>>> print(scores) # Outputs similarity scores for the utterance against all descriptions
56-
57-
Saving and loading the scorer:
58-
>>> scorer.dump("outputs/")
59-
>>> loaded_scorer = DescriptionScorer(embedder_name="your_embedder")
60-
>>> loaded_scorer.load("outputs/")
6143
"""
6244

6345
weights_file_name: str = "description_vectors.npy"

0 commit comments

Comments
 (0)