From 113f438e748ec0c90e1e4b4cf92c745b22912fb4 Mon Sep 17 00:00:00 2001 From: mbsantiago Date: Mon, 8 Dec 2025 17:19:33 +0000 Subject: [PATCH] Run lint fixes --- src/batdetect2/api.py | 2 +- src/batdetect2/api_v2.py | 2 +- src/batdetect2/audio/clips.py | 2 +- src/batdetect2/audio/loader.py | 1 - src/batdetect2/cli/data.py | 1 - src/batdetect2/cli/evaluate.py | 1 - src/batdetect2/cli/train.py | 1 - src/batdetect2/config.py | 2 +- src/batdetect2/core/arrays.py | 1 - src/batdetect2/core/configs.py | 2 +- src/batdetect2/data/annotations/__init__.py | 2 +- src/batdetect2/data/annotations/aoef.py | 2 +- src/batdetect2/data/conditions.py | 2 +- src/batdetect2/data/datasets.py | 2 +- src/batdetect2/data/iterators.py | 2 +- src/batdetect2/data/predictions/__init__.py | 7 +++++-- src/batdetect2/data/predictions/batdetect2.py | 2 +- src/batdetect2/data/predictions/parquet.py | 3 +-- src/batdetect2/data/predictions/raw.py | 2 +- src/batdetect2/data/predictions/soundevent.py | 2 +- src/batdetect2/data/split.py | 2 +- src/batdetect2/data/transforms.py | 2 +- src/batdetect2/detector/compute_features.py | 2 +- src/batdetect2/detector/parameters.py | 2 +- src/batdetect2/detector/post_process.py | 2 +- src/batdetect2/evaluate/affinity.py | 2 +- src/batdetect2/evaluate/config.py | 2 +- src/batdetect2/evaluate/dataset.py | 2 +- src/batdetect2/evaluate/evaluator.py | 6 +++--- .../evaluate/legacy/evaluate_models.py | 10 +++++----- src/batdetect2/evaluate/lightning.py | 2 +- src/batdetect2/evaluate/match.py | 6 +++--- .../evaluate/metrics/classification.py | 2 -- .../evaluate/metrics/clip_classification.py | 2 +- .../evaluate/metrics/clip_detection.py | 2 +- src/batdetect2/evaluate/metrics/common.py | 2 +- src/batdetect2/evaluate/metrics/detection.py | 2 -- src/batdetect2/evaluate/metrics/top_class.py | 3 --- src/batdetect2/evaluate/plots/base.py | 1 - src/batdetect2/evaluate/plots/classification.py | 2 -- .../evaluate/plots/clip_classification.py | 2 -- src/batdetect2/evaluate/plots/clip_detection.py | 2 -- src/batdetect2/evaluate/plots/detection.py | 2 -- src/batdetect2/evaluate/plots/top_class.py | 4 +--- src/batdetect2/evaluate/tables.py | 2 +- src/batdetect2/evaluate/tasks/__init__.py | 8 ++++++-- src/batdetect2/evaluate/tasks/base.py | 3 +-- src/batdetect2/finetune/finetune_model.py | 4 ++-- src/batdetect2/finetune/prep_data_finetune.py | 4 ++-- src/batdetect2/inference/dataset.py | 2 +- src/batdetect2/inference/lightning.py | 2 +- src/batdetect2/logging.py | 2 -- src/batdetect2/models/__init__.py | 2 +- src/batdetect2/models/bottleneck.py | 2 +- src/batdetect2/models/config.py | 1 - src/batdetect2/models/decoder.py | 4 ++-- src/batdetect2/models/detectors.py | 1 - src/batdetect2/models/encoder.py | 2 +- src/batdetect2/plotting/clip_annotations.py | 4 ++-- src/batdetect2/plotting/clip_predictions.py | 2 +- src/batdetect2/plotting/clips.py | 2 +- src/batdetect2/plotting/common.py | 2 +- src/batdetect2/plotting/detections.py | 1 - src/batdetect2/plotting/gallery.py | 10 +++++----- src/batdetect2/plotting/heatmaps.py | 2 +- src/batdetect2/plotting/legacy/plot.py | 2 +- src/batdetect2/plotting/matches.py | 2 +- src/batdetect2/plotting/metrics.py | 2 +- src/batdetect2/postprocess/config.py | 1 - src/batdetect2/postprocess/decoding.py | 4 ++-- src/batdetect2/postprocess/extraction.py | 2 +- src/batdetect2/postprocess/nms.py | 2 +- src/batdetect2/postprocess/postprocessor.py | 2 +- src/batdetect2/postprocess/remapping.py | 2 +- src/batdetect2/preprocess/audio.py | 2 +- src/batdetect2/preprocess/config.py | 2 +- src/batdetect2/preprocess/preprocessor.py | 1 - src/batdetect2/preprocess/spectrogram.py | 2 +- src/batdetect2/targets/classes.py | 2 +- src/batdetect2/targets/config.py | 2 +- src/batdetect2/targets/rois.py | 2 +- src/batdetect2/targets/targets.py | 2 +- src/batdetect2/train/augmentations.py | 6 +++--- src/batdetect2/train/callbacks.py | 2 +- src/batdetect2/train/checkpoints.py | 1 - src/batdetect2/train/config.py | 1 - src/batdetect2/train/dataset.py | 2 +- src/batdetect2/train/labels.py | 1 - src/batdetect2/train/legacy/train.py | 16 ++++++++-------- src/batdetect2/train/legacy/train_model.py | 8 ++++---- src/batdetect2/train/legacy/train_split.py | 2 +- src/batdetect2/train/legacy/train_utils.py | 2 +- src/batdetect2/train/lightning.py | 2 +- src/batdetect2/train/losses.py | 1 - src/batdetect2/types.py | 2 +- src/batdetect2/typing/data.py | 2 +- src/batdetect2/typing/evaluate.py | 1 - src/batdetect2/typing/postprocess.py | 2 +- src/batdetect2/typing/preprocess.py | 2 +- src/batdetect2/typing/targets.py | 2 +- src/batdetect2/typing/train.py | 2 +- src/batdetect2/utils/audio_utils.py | 2 +- src/batdetect2/utils/detector_utils.py | 4 ++-- src/batdetect2/utils/plot_utils.py | 4 ++-- src/batdetect2/utils/tensors.py | 1 - src/batdetect2/utils/visualize.py | 2 +- src/batdetect2/utils/wavfile.py | 2 +- tests/test_data/test_predictions/test_parquet.py | 5 ++++- tests/test_postprocessing/test_decoding.py | 1 + tests/test_postprocessing/test_extraction.py | 2 -- 110 files changed, 127 insertions(+), 156 deletions(-) diff --git a/src/batdetect2/api.py b/src/batdetect2/api.py index d2bcc41..9b137e0 100644 --- a/src/batdetect2/api.py +++ b/src/batdetect2/api.py @@ -98,7 +98,7 @@ consult the API documentation in the code. """ import warnings -from typing import List, Optional, Tuple +from typing import List, Tuple import numpy as np import torch diff --git a/src/batdetect2/api_v2.py b/src/batdetect2/api_v2.py index 529c5db..8a63d7b 100644 --- a/src/batdetect2/api_v2.py +++ b/src/batdetect2/api_v2.py @@ -1,6 +1,6 @@ import json from pathlib import Path -from typing import Dict, List, Optional, Sequence, Tuple +from typing import Dict, List, Sequence, Tuple import numpy as np import torch diff --git a/src/batdetect2/audio/clips.py b/src/batdetect2/audio/clips.py index ecfe5da..8364a40 100644 --- a/src/batdetect2/audio/clips.py +++ b/src/batdetect2/audio/clips.py @@ -1,4 +1,4 @@ -from typing import Annotated, List, Literal, Optional, Union +from typing import Annotated, List, Literal import numpy as np from loguru import logger diff --git a/src/batdetect2/audio/loader.py b/src/batdetect2/audio/loader.py index c02307d..0149853 100644 --- a/src/batdetect2/audio/loader.py +++ b/src/batdetect2/audio/loader.py @@ -1,4 +1,3 @@ -from typing import Optional import numpy as np from numpy.typing import DTypeLike diff --git a/src/batdetect2/cli/data.py b/src/batdetect2/cli/data.py index 2aba78f..20aa3e9 100644 --- a/src/batdetect2/cli/data.py +++ b/src/batdetect2/cli/data.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import Optional import click diff --git a/src/batdetect2/cli/evaluate.py b/src/batdetect2/cli/evaluate.py index 5874231..70458dc 100644 --- a/src/batdetect2/cli/evaluate.py +++ b/src/batdetect2/cli/evaluate.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import Optional import click from loguru import logger diff --git a/src/batdetect2/cli/train.py b/src/batdetect2/cli/train.py index 96f87f7..8837ad8 100644 --- a/src/batdetect2/cli/train.py +++ b/src/batdetect2/cli/train.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import Optional import click from loguru import logger diff --git a/src/batdetect2/config.py b/src/batdetect2/config.py index 1044d86..8412ede 100644 --- a/src/batdetect2/config.py +++ b/src/batdetect2/config.py @@ -1,4 +1,4 @@ -from typing import Literal, Optional +from typing import Literal from pydantic import Field from soundevent.data import PathLike diff --git a/src/batdetect2/core/arrays.py b/src/batdetect2/core/arrays.py index a146f14..4bcc5d5 100644 --- a/src/batdetect2/core/arrays.py +++ b/src/batdetect2/core/arrays.py @@ -1,4 +1,3 @@ -from typing import Optional import numpy as np import torch diff --git a/src/batdetect2/core/configs.py b/src/batdetect2/core/configs.py index 252c6e5..f2642f8 100644 --- a/src/batdetect2/core/configs.py +++ b/src/batdetect2/core/configs.py @@ -8,7 +8,7 @@ configuration data from files, with optional support for accessing nested configuration sections. """ -from typing import Any, Optional, Type, TypeVar +from typing import Any, Type, TypeVar import yaml from deepmerge.merger import Merger diff --git a/src/batdetect2/data/annotations/__init__.py b/src/batdetect2/data/annotations/__init__.py index b44b84b..a23a2ee 100644 --- a/src/batdetect2/data/annotations/__init__.py +++ b/src/batdetect2/data/annotations/__init__.py @@ -13,7 +13,7 @@ format-specific loading function to retrieve the annotations as a standard `soundevent.data.AnnotationSet`. """ -from typing import Annotated, Optional, Union +from typing import Annotated from pydantic import Field from soundevent import data diff --git a/src/batdetect2/data/annotations/aoef.py b/src/batdetect2/data/annotations/aoef.py index 35b65ea..e9924b8 100644 --- a/src/batdetect2/data/annotations/aoef.py +++ b/src/batdetect2/data/annotations/aoef.py @@ -12,7 +12,7 @@ that meet specific status criteria (e.g., completed, verified, without issues). """ from pathlib import Path -from typing import Literal, Optional +from typing import Literal from uuid import uuid5 from pydantic import Field diff --git a/src/batdetect2/data/conditions.py b/src/batdetect2/data/conditions.py index 04a8791..6556d10 100644 --- a/src/batdetect2/data/conditions.py +++ b/src/batdetect2/data/conditions.py @@ -1,5 +1,5 @@ from collections.abc import Callable -from typing import Annotated, List, Literal, Sequence, Union +from typing import Annotated, List, Literal, Sequence from pydantic import Field from soundevent import data diff --git a/src/batdetect2/data/datasets.py b/src/batdetect2/data/datasets.py index ef10077..a07f1bb 100644 --- a/src/batdetect2/data/datasets.py +++ b/src/batdetect2/data/datasets.py @@ -19,7 +19,7 @@ The core components are: """ from pathlib import Path -from typing import List, Optional, Sequence +from typing import List, Sequence from loguru import logger from pydantic import Field diff --git a/src/batdetect2/data/iterators.py b/src/batdetect2/data/iterators.py index 5a53441..c669776 100644 --- a/src/batdetect2/data/iterators.py +++ b/src/batdetect2/data/iterators.py @@ -1,5 +1,5 @@ from collections.abc import Generator -from typing import Optional, Tuple +from typing import Tuple from soundevent import data diff --git a/src/batdetect2/data/predictions/__init__.py b/src/batdetect2/data/predictions/__init__.py index 758c10d..638d9a0 100644 --- a/src/batdetect2/data/predictions/__init__.py +++ b/src/batdetect2/data/predictions/__init__.py @@ -1,4 +1,4 @@ -from typing import Annotated, Optional, Union +from typing import Annotated from pydantic import Field from soundevent.data import PathLike @@ -24,7 +24,10 @@ __all__ = [ OutputFormatConfig = Annotated[ - BatDetect2OutputConfig | ParquetOutputConfig | SoundEventOutputConfig | RawOutputConfig, + BatDetect2OutputConfig + | ParquetOutputConfig + | SoundEventOutputConfig + | RawOutputConfig, Field(discriminator="name"), ] diff --git a/src/batdetect2/data/predictions/batdetect2.py b/src/batdetect2/data/predictions/batdetect2.py index 67d4796..7dc58ad 100644 --- a/src/batdetect2/data/predictions/batdetect2.py +++ b/src/batdetect2/data/predictions/batdetect2.py @@ -1,6 +1,6 @@ import json from pathlib import Path -from typing import List, Literal, Optional, Sequence, TypedDict +from typing import List, Literal, Sequence, TypedDict import numpy as np from soundevent import data diff --git a/src/batdetect2/data/predictions/parquet.py b/src/batdetect2/data/predictions/parquet.py index 3b8d820..52bdc71 100644 --- a/src/batdetect2/data/predictions/parquet.py +++ b/src/batdetect2/data/predictions/parquet.py @@ -1,6 +1,5 @@ -import json from pathlib import Path -from typing import List, Literal, Optional, Sequence +from typing import List, Literal, Sequence from uuid import UUID import numpy as np diff --git a/src/batdetect2/data/predictions/raw.py b/src/batdetect2/data/predictions/raw.py index 8205a0d..e509e84 100644 --- a/src/batdetect2/data/predictions/raw.py +++ b/src/batdetect2/data/predictions/raw.py @@ -1,6 +1,6 @@ from collections import defaultdict from pathlib import Path -from typing import List, Literal, Optional, Sequence +from typing import List, Literal, Sequence from uuid import UUID, uuid4 import numpy as np diff --git a/src/batdetect2/data/predictions/soundevent.py b/src/batdetect2/data/predictions/soundevent.py index 36cb407..e851685 100644 --- a/src/batdetect2/data/predictions/soundevent.py +++ b/src/batdetect2/data/predictions/soundevent.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import List, Literal, Optional, Sequence +from typing import List, Literal, Sequence import numpy as np from soundevent import data, io diff --git a/src/batdetect2/data/split.py b/src/batdetect2/data/split.py index 81348d9..40c69fc 100644 --- a/src/batdetect2/data/split.py +++ b/src/batdetect2/data/split.py @@ -1,4 +1,4 @@ -from typing import Optional, Tuple +from typing import Tuple from sklearn.model_selection import train_test_split diff --git a/src/batdetect2/data/transforms.py b/src/batdetect2/data/transforms.py index 8e94a36..a19250a 100644 --- a/src/batdetect2/data/transforms.py +++ b/src/batdetect2/data/transforms.py @@ -1,5 +1,5 @@ from collections.abc import Callable -from typing import Annotated, Dict, List, Literal, Optional, Union +from typing import Annotated, Dict, List, Literal from pydantic import Field from soundevent import data diff --git a/src/batdetect2/detector/compute_features.py b/src/batdetect2/detector/compute_features.py index d7d18e6..1ee9097 100644 --- a/src/batdetect2/detector/compute_features.py +++ b/src/batdetect2/detector/compute_features.py @@ -1,6 +1,6 @@ """Functions to compute features from predictions.""" -from typing import Dict, List, Optional +from typing import Dict, List import numpy as np diff --git a/src/batdetect2/detector/parameters.py b/src/batdetect2/detector/parameters.py index ba2b430..b440f5c 100644 --- a/src/batdetect2/detector/parameters.py +++ b/src/batdetect2/detector/parameters.py @@ -1,7 +1,7 @@ import datetime import os from pathlib import Path -from typing import List, Optional, Union +from typing import List from pydantic import BaseModel, Field, computed_field diff --git a/src/batdetect2/detector/post_process.py b/src/batdetect2/detector/post_process.py index fc5a14e..637deb1 100644 --- a/src/batdetect2/detector/post_process.py +++ b/src/batdetect2/detector/post_process.py @@ -1,6 +1,6 @@ """Post-processing of the output of the model.""" -from typing import List, Tuple, Union +from typing import List, Tuple import numpy as np import torch diff --git a/src/batdetect2/evaluate/affinity.py b/src/batdetect2/evaluate/affinity.py index a9ee307..a95cb75 100644 --- a/src/batdetect2/evaluate/affinity.py +++ b/src/batdetect2/evaluate/affinity.py @@ -1,4 +1,4 @@ -from typing import Annotated, Literal, Optional, Union +from typing import Annotated, Literal from pydantic import Field from soundevent import data diff --git a/src/batdetect2/evaluate/config.py b/src/batdetect2/evaluate/config.py index 71c32b6..f41edef 100644 --- a/src/batdetect2/evaluate/config.py +++ b/src/batdetect2/evaluate/config.py @@ -1,4 +1,4 @@ -from typing import List, Optional +from typing import List from pydantic import Field from soundevent import data diff --git a/src/batdetect2/evaluate/dataset.py b/src/batdetect2/evaluate/dataset.py index 36f15af..c029636 100644 --- a/src/batdetect2/evaluate/dataset.py +++ b/src/batdetect2/evaluate/dataset.py @@ -1,4 +1,4 @@ -from typing import List, NamedTuple, Optional, Sequence +from typing import List, NamedTuple, Sequence import torch from loguru import logger diff --git a/src/batdetect2/evaluate/evaluator.py b/src/batdetect2/evaluate/evaluator.py index d29df07..6c5009c 100644 --- a/src/batdetect2/evaluate/evaluator.py +++ b/src/batdetect2/evaluate/evaluator.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, Iterable, List, Optional, Sequence, Tuple, Union +from typing import Any, Dict, Iterable, List, Sequence, Tuple from matplotlib.figure import Figure from soundevent import data @@ -36,7 +36,7 @@ class Evaluator: def compute_metrics(self, eval_outputs: List[Any]) -> Dict[str, float]: results = {} - for task, outputs in zip(self.tasks, eval_outputs): + for task, outputs in zip(self.tasks, eval_outputs, strict=False): results.update(task.compute_metrics(outputs)) return results @@ -45,7 +45,7 @@ class Evaluator: self, eval_outputs: List[Any], ) -> Iterable[Tuple[str, Figure]]: - for task, outputs in zip(self.tasks, eval_outputs): + for task, outputs in zip(self.tasks, eval_outputs, strict=False): for name, fig in task.generate_plots(outputs): yield name, fig diff --git a/src/batdetect2/evaluate/legacy/evaluate_models.py b/src/batdetect2/evaluate/legacy/evaluate_models.py index 88cab61..d67cfad 100644 --- a/src/batdetect2/evaluate/legacy/evaluate_models.py +++ b/src/batdetect2/evaluate/legacy/evaluate_models.py @@ -357,7 +357,7 @@ def train_rf_model(x_train, y_train, num_classes, seed=2001): clf = RandomForestClassifier(random_state=seed, n_jobs=-1) clf.fit(x_train, y_train) y_pred = clf.predict(x_train) - tr_acc = (y_pred == y_train).mean() + (y_pred == y_train).mean() # print('Train acc', round(tr_acc*100, 2)) return clf, un_train_class @@ -450,7 +450,7 @@ def add_root_path_back(data_sets, ann_path, wav_path): def check_classes_in_train(gt_list, class_names): - num_gt_total = np.sum([gg["start_times"].shape[0] for gg in gt_list]) + np.sum([gg["start_times"].shape[0] for gg in gt_list]) num_with_no_class = 0 for gt in gt_list: for cc in gt["class_names"]: @@ -569,7 +569,7 @@ if __name__ == "__main__": num_with_no_class = check_classes_in_train(gt_test, class_names) if total_num_calls == num_with_no_class: print("Classes from the test set are not in the train set.") - assert False + raise AssertionError() # only need the train data if evaluating Sonobat or Tadarida if args["sb_ip_dir"] != "" or args["td_ip_dir"] != "": @@ -743,7 +743,7 @@ if __name__ == "__main__": # check if the class names are the same if params_bd["class_names"] != class_names: print("Warning: Class names are not the same as the trained model") - assert False + raise AssertionError() run_config = { **bd_args, @@ -753,7 +753,7 @@ if __name__ == "__main__": preds_bd = [] device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - for ii, gg in enumerate(gt_test): + for gg in gt_test: pred = du.process_file( gg["file_path"], model, diff --git a/src/batdetect2/evaluate/lightning.py b/src/batdetect2/evaluate/lightning.py index f7dac85..231e65d 100644 --- a/src/batdetect2/evaluate/lightning.py +++ b/src/batdetect2/evaluate/lightning.py @@ -47,7 +47,7 @@ class EvaluationModule(LightningModule): ), ) for clip_annotation, clip_dets in zip( - clip_annotations, clip_detections + clip_annotations, clip_detections, strict=False ) ] diff --git a/src/batdetect2/evaluate/match.py b/src/batdetect2/evaluate/match.py index fe0b0c5..247ddb9 100644 --- a/src/batdetect2/evaluate/match.py +++ b/src/batdetect2/evaluate/match.py @@ -1,5 +1,5 @@ from collections.abc import Callable, Iterable, Mapping -from typing import Annotated, List, Literal, Optional, Sequence, Tuple, Union +from typing import Annotated, List, Literal, Sequence, Tuple import numpy as np from pydantic import Field @@ -94,7 +94,7 @@ def match( class_name: score for class_name, score in zip( targets.class_names, - prediction.class_scores, + prediction.class_scores, strict=False, ) } if prediction is not None @@ -563,7 +563,7 @@ def select_optimal_matches( maximize=True, ) - for gt_idx, pred_idx in zip(assiged_rows, assigned_columns): + for gt_idx, pred_idx in zip(assiged_rows, assigned_columns, strict=False): affinity = float(affinity_matrix[gt_idx, pred_idx]) if affinity <= affinity_threshold: diff --git a/src/batdetect2/evaluate/metrics/classification.py b/src/batdetect2/evaluate/metrics/classification.py index cbab6a6..13c7779 100644 --- a/src/batdetect2/evaluate/metrics/classification.py +++ b/src/batdetect2/evaluate/metrics/classification.py @@ -7,10 +7,8 @@ from typing import ( List, Literal, Mapping, - Optional, Sequence, Tuple, - Union, ) import numpy as np diff --git a/src/batdetect2/evaluate/metrics/clip_classification.py b/src/batdetect2/evaluate/metrics/clip_classification.py index a566c97..80e5020 100644 --- a/src/batdetect2/evaluate/metrics/clip_classification.py +++ b/src/batdetect2/evaluate/metrics/clip_classification.py @@ -1,6 +1,6 @@ from collections import defaultdict from dataclasses import dataclass -from typing import Annotated, Callable, Dict, Literal, Sequence, Set, Union +from typing import Annotated, Callable, Dict, Literal, Sequence, Set import numpy as np from pydantic import Field diff --git a/src/batdetect2/evaluate/metrics/clip_detection.py b/src/batdetect2/evaluate/metrics/clip_detection.py index 728152c..1bab7b3 100644 --- a/src/batdetect2/evaluate/metrics/clip_detection.py +++ b/src/batdetect2/evaluate/metrics/clip_detection.py @@ -1,5 +1,5 @@ from dataclasses import dataclass -from typing import Annotated, Callable, Dict, Literal, Sequence, Union +from typing import Annotated, Callable, Dict, Literal, Sequence import numpy as np from pydantic import Field diff --git a/src/batdetect2/evaluate/metrics/common.py b/src/batdetect2/evaluate/metrics/common.py index 77e8aa5..9a4da37 100644 --- a/src/batdetect2/evaluate/metrics/common.py +++ b/src/batdetect2/evaluate/metrics/common.py @@ -1,4 +1,4 @@ -from typing import Optional, Tuple +from typing import Tuple import numpy as np diff --git a/src/batdetect2/evaluate/metrics/detection.py b/src/batdetect2/evaluate/metrics/detection.py index e625435..493f3cb 100644 --- a/src/batdetect2/evaluate/metrics/detection.py +++ b/src/batdetect2/evaluate/metrics/detection.py @@ -5,9 +5,7 @@ from typing import ( Dict, List, Literal, - Optional, Sequence, - Union, ) import numpy as np diff --git a/src/batdetect2/evaluate/metrics/top_class.py b/src/batdetect2/evaluate/metrics/top_class.py index 96fec6e..c4d6514 100644 --- a/src/batdetect2/evaluate/metrics/top_class.py +++ b/src/batdetect2/evaluate/metrics/top_class.py @@ -1,4 +1,3 @@ -from collections import defaultdict from dataclasses import dataclass from typing import ( Annotated, @@ -6,9 +5,7 @@ from typing import ( Dict, List, Literal, - Optional, Sequence, - Union, ) import numpy as np diff --git a/src/batdetect2/evaluate/plots/base.py b/src/batdetect2/evaluate/plots/base.py index bce076b..10c74e0 100644 --- a/src/batdetect2/evaluate/plots/base.py +++ b/src/batdetect2/evaluate/plots/base.py @@ -1,4 +1,3 @@ -from typing import Optional import matplotlib.pyplot as plt from matplotlib.figure import Figure diff --git a/src/batdetect2/evaluate/plots/classification.py b/src/batdetect2/evaluate/plots/classification.py index 98f92b6..a9d8a6e 100644 --- a/src/batdetect2/evaluate/plots/classification.py +++ b/src/batdetect2/evaluate/plots/classification.py @@ -3,10 +3,8 @@ from typing import ( Callable, Iterable, Literal, - Optional, Sequence, Tuple, - Union, ) import matplotlib.pyplot as plt diff --git a/src/batdetect2/evaluate/plots/clip_classification.py b/src/batdetect2/evaluate/plots/clip_classification.py index 40bef6e..7def4d0 100644 --- a/src/batdetect2/evaluate/plots/clip_classification.py +++ b/src/batdetect2/evaluate/plots/clip_classification.py @@ -3,10 +3,8 @@ from typing import ( Callable, Iterable, Literal, - Optional, Sequence, Tuple, - Union, ) import matplotlib.pyplot as plt diff --git a/src/batdetect2/evaluate/plots/clip_detection.py b/src/batdetect2/evaluate/plots/clip_detection.py index 1feec3e..9dd2108 100644 --- a/src/batdetect2/evaluate/plots/clip_detection.py +++ b/src/batdetect2/evaluate/plots/clip_detection.py @@ -3,10 +3,8 @@ from typing import ( Callable, Iterable, Literal, - Optional, Sequence, Tuple, - Union, ) import pandas as pd diff --git a/src/batdetect2/evaluate/plots/detection.py b/src/batdetect2/evaluate/plots/detection.py index 34756ea..22eb252 100644 --- a/src/batdetect2/evaluate/plots/detection.py +++ b/src/batdetect2/evaluate/plots/detection.py @@ -4,10 +4,8 @@ from typing import ( Callable, Iterable, Literal, - Optional, Sequence, Tuple, - Union, ) import matplotlib.pyplot as plt diff --git a/src/batdetect2/evaluate/plots/top_class.py b/src/batdetect2/evaluate/plots/top_class.py index 5bbc721..2ca9bf9 100644 --- a/src/batdetect2/evaluate/plots/top_class.py +++ b/src/batdetect2/evaluate/plots/top_class.py @@ -8,10 +8,8 @@ from typing import ( Iterable, List, Literal, - Optional, Sequence, Tuple, - Union, ) import matplotlib.pyplot as plt @@ -405,7 +403,7 @@ def get_binned_sample(matches: List[MatchEval], n_examples: int = 5): return matches indices, pred_scores = zip( - *[(index, match.score) for index, match in enumerate(matches)] + *[(index, match.score) for index, match in enumerate(matches)], strict=False ) bins = pd.qcut(pred_scores, q=n_examples, labels=False, duplicates="drop") diff --git a/src/batdetect2/evaluate/tables.py b/src/batdetect2/evaluate/tables.py index 8724d8f..4de4e03 100644 --- a/src/batdetect2/evaluate/tables.py +++ b/src/batdetect2/evaluate/tables.py @@ -1,4 +1,4 @@ -from typing import Annotated, Callable, Literal, Sequence, Union +from typing import Annotated, Callable, Literal, Sequence import pandas as pd from pydantic import Field diff --git a/src/batdetect2/evaluate/tasks/__init__.py b/src/batdetect2/evaluate/tasks/__init__.py index 9c310d9..3c2e74e 100644 --- a/src/batdetect2/evaluate/tasks/__init__.py +++ b/src/batdetect2/evaluate/tasks/__init__.py @@ -1,4 +1,4 @@ -from typing import Annotated, Optional, Sequence, Union +from typing import Annotated, Optional, Sequence from pydantic import Field from soundevent import data @@ -26,7 +26,11 @@ __all__ = [ TaskConfig = Annotated[ - ClassificationTaskConfig | DetectionTaskConfig | ClipDetectionTaskConfig | ClipClassificationTaskConfig | TopClassDetectionTaskConfig, + ClassificationTaskConfig + | DetectionTaskConfig + | ClipDetectionTaskConfig + | ClipClassificationTaskConfig + | TopClassDetectionTaskConfig, Field(discriminator="name"), ] diff --git a/src/batdetect2/evaluate/tasks/base.py b/src/batdetect2/evaluate/tasks/base.py index 2c793f2..4fa15cd 100644 --- a/src/batdetect2/evaluate/tasks/base.py +++ b/src/batdetect2/evaluate/tasks/base.py @@ -4,7 +4,6 @@ from typing import ( Generic, Iterable, List, - Optional, Sequence, Tuple, TypeVar, @@ -101,7 +100,7 @@ class BaseTask(EvaluatorProtocol, Generic[T_Output]): ) -> List[T_Output]: return [ self.evaluate_clip(clip_annotation, preds) - for clip_annotation, preds in zip(clip_annotations, predictions) + for clip_annotation, preds in zip(clip_annotations, predictions, strict=False) ] def evaluate_clip( diff --git a/src/batdetect2/finetune/finetune_model.py b/src/batdetect2/finetune/finetune_model.py index b049b7a..315b02a 100644 --- a/src/batdetect2/finetune/finetune_model.py +++ b/src/batdetect2/finetune/finetune_model.py @@ -1,7 +1,7 @@ import argparse import os import warnings -from typing import List, Optional +from typing import List import torch import torch.utils.data @@ -88,7 +88,7 @@ def select_device(warn=True) -> str: if warn: warnings.warn( "No GPU available, using the CPU instead. Please consider using a GPU " - "to speed up training." + "to speed up training.", stacklevel=2 ) return "cpu" diff --git a/src/batdetect2/finetune/prep_data_finetune.py b/src/batdetect2/finetune/prep_data_finetune.py index 1df46eb..76bd627 100644 --- a/src/batdetect2/finetune/prep_data_finetune.py +++ b/src/batdetect2/finetune/prep_data_finetune.py @@ -2,7 +2,7 @@ import argparse import json import os from collections import Counter -from typing import List, Optional, Tuple +from typing import List, Tuple import numpy as np from sklearn.model_selection import StratifiedGroupKFold @@ -162,7 +162,7 @@ def main(): # change the names of the classes ip_names = args.input_class_names.split(";") op_names = args.output_class_names.split(";") - name_dict = dict(zip(ip_names, op_names)) + name_dict = dict(zip(ip_names, op_names, strict=False)) # load annotations data_all = tu.load_set_of_anns( diff --git a/src/batdetect2/inference/dataset.py b/src/batdetect2/inference/dataset.py index 62b696a..cf6ad09 100644 --- a/src/batdetect2/inference/dataset.py +++ b/src/batdetect2/inference/dataset.py @@ -1,4 +1,4 @@ -from typing import List, NamedTuple, Optional, Sequence +from typing import List, NamedTuple, Sequence import torch from loguru import logger diff --git a/src/batdetect2/inference/lightning.py b/src/batdetect2/inference/lightning.py index d6ff5fb..e36224b 100644 --- a/src/batdetect2/inference/lightning.py +++ b/src/batdetect2/inference/lightning.py @@ -39,7 +39,7 @@ class InferenceModule(LightningModule): targets=self.model.targets, ), ) - for clip, clip_dets in zip(clips, clip_detections) + for clip, clip_dets in zip(clips, clip_detections, strict=False) ] return predictions diff --git a/src/batdetect2/logging.py b/src/batdetect2/logging.py index 01f8acc..aadd92c 100644 --- a/src/batdetect2/logging.py +++ b/src/batdetect2/logging.py @@ -9,10 +9,8 @@ from typing import ( Dict, Generic, Literal, - Optional, Protocol, TypeVar, - Union, ) import numpy as np diff --git a/src/batdetect2/models/__init__.py b/src/batdetect2/models/__init__.py index fc15357..90ab1dc 100644 --- a/src/batdetect2/models/__init__.py +++ b/src/batdetect2/models/__init__.py @@ -26,7 +26,7 @@ for creating a standard BatDetect2 model instance is the `build_model` function provided here. """ -from typing import List, Optional +from typing import List import torch diff --git a/src/batdetect2/models/bottleneck.py b/src/batdetect2/models/bottleneck.py index 879fc18..a04b18d 100644 --- a/src/batdetect2/models/bottleneck.py +++ b/src/batdetect2/models/bottleneck.py @@ -14,7 +14,7 @@ A factory function `build_bottleneck` constructs the appropriate bottleneck module based on the provided configuration. """ -from typing import Annotated, List, Optional, Union +from typing import Annotated, List import torch from pydantic import Field diff --git a/src/batdetect2/models/config.py b/src/batdetect2/models/config.py index 12c0f26..84ebef1 100644 --- a/src/batdetect2/models/config.py +++ b/src/batdetect2/models/config.py @@ -1,4 +1,3 @@ -from typing import Optional from soundevent import data diff --git a/src/batdetect2/models/decoder.py b/src/batdetect2/models/decoder.py index 233b0d3..a79524b 100644 --- a/src/batdetect2/models/decoder.py +++ b/src/batdetect2/models/decoder.py @@ -18,7 +18,7 @@ The `Decoder`'s `forward` method is designed to accept skip connection tensors at each stage. """ -from typing import Annotated, List, Optional, Union +from typing import Annotated, List import torch from pydantic import Field @@ -182,7 +182,7 @@ class Decoder(nn.Module): f"but got {len(residuals)}." ) - for layer, res in zip(self.layers, residuals[::-1]): + for layer, res in zip(self.layers, residuals[::-1], strict=False): x = layer(x + res) return x diff --git a/src/batdetect2/models/detectors.py b/src/batdetect2/models/detectors.py index 7bad757..56c4ea9 100644 --- a/src/batdetect2/models/detectors.py +++ b/src/batdetect2/models/detectors.py @@ -14,7 +14,6 @@ logic for preprocessing inputs and postprocessing/decoding outputs resides in the `batdetect2.preprocess` and `batdetect2.postprocess` packages, respectively. """ -from typing import Optional import torch from loguru import logger diff --git a/src/batdetect2/models/encoder.py b/src/batdetect2/models/encoder.py index 70aa6c8..4081260 100644 --- a/src/batdetect2/models/encoder.py +++ b/src/batdetect2/models/encoder.py @@ -20,7 +20,7 @@ bottleneck output. A default configuration (`DEFAULT_ENCODER_CONFIG`) is also provided. """ -from typing import Annotated, List, Optional, Union +from typing import Annotated, List import torch from pydantic import Field diff --git a/src/batdetect2/plotting/clip_annotations.py b/src/batdetect2/plotting/clip_annotations.py index c52de62..7872747 100644 --- a/src/batdetect2/plotting/clip_annotations.py +++ b/src/batdetect2/plotting/clip_annotations.py @@ -1,4 +1,4 @@ -from typing import Optional, Tuple +from typing import Tuple from matplotlib.axes import Axes from soundevent import data, plot @@ -68,6 +68,6 @@ def plot_anchor_points( position, _ = targets.encode_roi(sound_event) positions.append(position) - X, Y = zip(*positions) + X, Y = zip(*positions, strict=False) ax.scatter(X, Y, s=size, c=color, marker=marker, alpha=alpha) return ax diff --git a/src/batdetect2/plotting/clip_predictions.py b/src/batdetect2/plotting/clip_predictions.py index 1827a00..fc28e22 100644 --- a/src/batdetect2/plotting/clip_predictions.py +++ b/src/batdetect2/plotting/clip_predictions.py @@ -1,4 +1,4 @@ -from typing import Iterable, Optional, Tuple +from typing import Iterable, Tuple from matplotlib.axes import Axes from soundevent import data diff --git a/src/batdetect2/plotting/clips.py b/src/batdetect2/plotting/clips.py index e634c37..9a7e541 100644 --- a/src/batdetect2/plotting/clips.py +++ b/src/batdetect2/plotting/clips.py @@ -1,4 +1,4 @@ -from typing import Optional, Tuple +from typing import Tuple import matplotlib.pyplot as plt import torch diff --git a/src/batdetect2/plotting/common.py b/src/batdetect2/plotting/common.py index ef1231f..0bf6eca 100644 --- a/src/batdetect2/plotting/common.py +++ b/src/batdetect2/plotting/common.py @@ -1,6 +1,6 @@ """General plotting utilities.""" -from typing import Optional, Tuple, Union +from typing import Tuple import matplotlib.pyplot as plt import numpy as np diff --git a/src/batdetect2/plotting/detections.py b/src/batdetect2/plotting/detections.py index 442953c..d338483 100644 --- a/src/batdetect2/plotting/detections.py +++ b/src/batdetect2/plotting/detections.py @@ -1,4 +1,3 @@ -from typing import Optional from matplotlib import axes, patches from soundevent.plot import plot_geometry diff --git a/src/batdetect2/plotting/gallery.py b/src/batdetect2/plotting/gallery.py index d16ac45..a6fc906 100644 --- a/src/batdetect2/plotting/gallery.py +++ b/src/batdetect2/plotting/gallery.py @@ -1,4 +1,4 @@ -from typing import Optional, Sequence +from typing import Sequence import matplotlib.pyplot as plt from matplotlib.figure import Figure @@ -36,7 +36,7 @@ def plot_match_gallery( sharey="row", ) - for tp_ax, tp_match in zip(axes[0], true_positives[:n_examples]): + for tp_ax, tp_match in zip(axes[0], true_positives[:n_examples], strict=False): try: plot_true_positive_match( tp_match, @@ -53,7 +53,7 @@ def plot_match_gallery( ): continue - for fp_ax, fp_match in zip(axes[1], false_positives[:n_examples]): + for fp_ax, fp_match in zip(axes[1], false_positives[:n_examples], strict=False): try: plot_false_positive_match( fp_match, @@ -70,7 +70,7 @@ def plot_match_gallery( ): continue - for fn_ax, fn_match in zip(axes[2], false_negatives[:n_examples]): + for fn_ax, fn_match in zip(axes[2], false_negatives[:n_examples], strict=False): try: plot_false_negative_match( fn_match, @@ -87,7 +87,7 @@ def plot_match_gallery( ): continue - for ct_ax, ct_match in zip(axes[3], cross_triggers[:n_examples]): + for ct_ax, ct_match in zip(axes[3], cross_triggers[:n_examples], strict=False): try: plot_cross_trigger_match( ct_match, diff --git a/src/batdetect2/plotting/heatmaps.py b/src/batdetect2/plotting/heatmaps.py index fd67632..9376590 100644 --- a/src/batdetect2/plotting/heatmaps.py +++ b/src/batdetect2/plotting/heatmaps.py @@ -1,6 +1,6 @@ """Plot heatmaps""" -from typing import List, Optional, Tuple, Union +from typing import List, Tuple import numpy as np import torch diff --git a/src/batdetect2/plotting/legacy/plot.py b/src/batdetect2/plotting/legacy/plot.py index 84ad89a..bac240f 100644 --- a/src/batdetect2/plotting/legacy/plot.py +++ b/src/batdetect2/plotting/legacy/plot.py @@ -1,6 +1,6 @@ """Plot functions to visualize detections and spectrograms.""" -from typing import List, Optional, Tuple, Union, cast +from typing import List, Tuple, cast import matplotlib.ticker as tick import numpy as np diff --git a/src/batdetect2/plotting/matches.py b/src/batdetect2/plotting/matches.py index 7da593c..c2733d9 100644 --- a/src/batdetect2/plotting/matches.py +++ b/src/batdetect2/plotting/matches.py @@ -1,4 +1,4 @@ -from typing import Optional, Protocol, Tuple, Union +from typing import Protocol, Tuple from matplotlib.axes import Axes from soundevent import data, plot diff --git a/src/batdetect2/plotting/metrics.py b/src/batdetect2/plotting/metrics.py index 61ce7b4..30f8244 100644 --- a/src/batdetect2/plotting/metrics.py +++ b/src/batdetect2/plotting/metrics.py @@ -1,4 +1,4 @@ -from typing import Dict, Optional, Tuple, Union +from typing import Dict, Tuple import numpy as np import seaborn as sns diff --git a/src/batdetect2/postprocess/config.py b/src/batdetect2/postprocess/config.py index 82de367..4046d59 100644 --- a/src/batdetect2/postprocess/config.py +++ b/src/batdetect2/postprocess/config.py @@ -1,4 +1,3 @@ -from typing import Optional from pydantic import Field from soundevent import data diff --git a/src/batdetect2/postprocess/decoding.py b/src/batdetect2/postprocess/decoding.py index 5fb65e4..2974771 100644 --- a/src/batdetect2/postprocess/decoding.py +++ b/src/batdetect2/postprocess/decoding.py @@ -1,6 +1,6 @@ """Decodes extracted detection data into standard soundevent predictions.""" -from typing import List, Optional +from typing import List import numpy as np from soundevent import data @@ -39,7 +39,7 @@ def to_raw_predictions( detections.times, detections.frequencies, detections.sizes, - detections.features, + detections.features, strict=False, ): highest_scoring_class = targets.class_names[class_scores.argmax()] diff --git a/src/batdetect2/postprocess/extraction.py b/src/batdetect2/postprocess/extraction.py index 74fdf20..15c59be 100644 --- a/src/batdetect2/postprocess/extraction.py +++ b/src/batdetect2/postprocess/extraction.py @@ -15,7 +15,7 @@ precise time-frequency location of each detection. The final output aggregates all extracted information into a structured `xarray.Dataset`. """ -from typing import List, Optional +from typing import List import torch diff --git a/src/batdetect2/postprocess/nms.py b/src/batdetect2/postprocess/nms.py index 80114d0..c4731f6 100644 --- a/src/batdetect2/postprocess/nms.py +++ b/src/batdetect2/postprocess/nms.py @@ -11,7 +11,7 @@ activations that have lower scores than a local maximum. This helps prevent multiple, overlapping detections originating from the same sound event. """ -from typing import Tuple, Union +from typing import Tuple import torch diff --git a/src/batdetect2/postprocess/postprocessor.py b/src/batdetect2/postprocess/postprocessor.py index c3f7b9c..9d7c339 100644 --- a/src/batdetect2/postprocess/postprocessor.py +++ b/src/batdetect2/postprocess/postprocessor.py @@ -1,4 +1,4 @@ -from typing import List, Optional, Tuple, Union +from typing import List, Tuple import torch from loguru import logger diff --git a/src/batdetect2/postprocess/remapping.py b/src/batdetect2/postprocess/remapping.py index 516b86e..e47aee3 100644 --- a/src/batdetect2/postprocess/remapping.py +++ b/src/batdetect2/postprocess/remapping.py @@ -12,7 +12,7 @@ classification probability maps, size prediction maps, and potentially intermediate features. """ -from typing import Dict, List, Optional, Union +from typing import Dict, List import numpy as np import torch diff --git a/src/batdetect2/preprocess/audio.py b/src/batdetect2/preprocess/audio.py index 86f485b..89afddc 100644 --- a/src/batdetect2/preprocess/audio.py +++ b/src/batdetect2/preprocess/audio.py @@ -1,4 +1,4 @@ -from typing import Annotated, Literal, Union +from typing import Annotated, Literal import torch from pydantic import Field diff --git a/src/batdetect2/preprocess/config.py b/src/batdetect2/preprocess/config.py index 9f2cd24..10676c3 100644 --- a/src/batdetect2/preprocess/config.py +++ b/src/batdetect2/preprocess/config.py @@ -1,4 +1,4 @@ -from typing import List, Optional +from typing import List from pydantic import Field from soundevent.data import PathLike diff --git a/src/batdetect2/preprocess/preprocessor.py b/src/batdetect2/preprocess/preprocessor.py index 4358bce..47569a8 100644 --- a/src/batdetect2/preprocess/preprocessor.py +++ b/src/batdetect2/preprocess/preprocessor.py @@ -1,4 +1,3 @@ -from typing import Optional import torch from loguru import logger diff --git a/src/batdetect2/preprocess/spectrogram.py b/src/batdetect2/preprocess/spectrogram.py index e59a8c7..926055b 100644 --- a/src/batdetect2/preprocess/spectrogram.py +++ b/src/batdetect2/preprocess/spectrogram.py @@ -1,6 +1,6 @@ """Computes spectrograms from audio waveforms with configurable parameters.""" -from typing import Annotated, Callable, Literal, Optional, Union +from typing import Annotated, Callable, Literal import numpy as np import torch diff --git a/src/batdetect2/targets/classes.py b/src/batdetect2/targets/classes.py index 138901b..30fd021 100644 --- a/src/batdetect2/targets/classes.py +++ b/src/batdetect2/targets/classes.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Optional +from typing import Dict, List from pydantic import Field, PrivateAttr, computed_field, model_validator from soundevent import data diff --git a/src/batdetect2/targets/config.py b/src/batdetect2/targets/config.py index 87f5491..8e70a61 100644 --- a/src/batdetect2/targets/config.py +++ b/src/batdetect2/targets/config.py @@ -1,5 +1,5 @@ from collections import Counter -from typing import List, Optional +from typing import List from pydantic import Field, field_validator from soundevent import data diff --git a/src/batdetect2/targets/rois.py b/src/batdetect2/targets/rois.py index 27d7d09..672f90b 100644 --- a/src/batdetect2/targets/rois.py +++ b/src/batdetect2/targets/rois.py @@ -20,7 +20,7 @@ selecting and configuring the desired mapper. This module separates the *geometric* aspect of target definition from *semantic* classification. """ -from typing import Annotated, Literal, Optional, Tuple, Union +from typing import Annotated, Literal, Tuple import numpy as np from pydantic import Field diff --git a/src/batdetect2/targets/targets.py b/src/batdetect2/targets/targets.py index 9aa4fe8..9b09c2d 100644 --- a/src/batdetect2/targets/targets.py +++ b/src/batdetect2/targets/targets.py @@ -1,4 +1,4 @@ -from typing import Iterable, List, Optional, Tuple +from typing import Iterable, List, Tuple from loguru import logger from soundevent import data diff --git a/src/batdetect2/train/augmentations.py b/src/batdetect2/train/augmentations.py index 9c67a65..8deff36 100644 --- a/src/batdetect2/train/augmentations.py +++ b/src/batdetect2/train/augmentations.py @@ -2,7 +2,7 @@ import warnings from collections.abc import Sequence -from typing import Annotated, Callable, List, Literal, Optional, Tuple, Union +from typing import Annotated, Callable, List, Literal, Tuple import numpy as np import torch @@ -394,7 +394,7 @@ class MaskTime(torch.nn.Module): size=num_masks, ) masks = [ - (start, start + size) for start, size in zip(mask_start, mask_size) + (start, start + size) for start, size in zip(mask_start, mask_size, strict=False) ] return mask_time(spec, masks), clip_annotation @@ -460,7 +460,7 @@ class MaskFrequency(torch.nn.Module): size=num_masks, ) masks = [ - (start, start + size) for start, size in zip(mask_start, mask_size) + (start, start + size) for start, size in zip(mask_start, mask_size, strict=False) ] return mask_frequency(spec, masks), clip_annotation diff --git a/src/batdetect2/train/callbacks.py b/src/batdetect2/train/callbacks.py index bac1a53..2be538f 100644 --- a/src/batdetect2/train/callbacks.py +++ b/src/batdetect2/train/callbacks.py @@ -107,7 +107,7 @@ class ValidationMetrics(Callback): ), ) for clip_annotation, clip_dets in zip( - clip_annotations, clip_detections + clip_annotations, clip_detections, strict=False ) ] diff --git a/src/batdetect2/train/checkpoints.py b/src/batdetect2/train/checkpoints.py index f8d6127..fb68503 100644 --- a/src/batdetect2/train/checkpoints.py +++ b/src/batdetect2/train/checkpoints.py @@ -1,5 +1,4 @@ from pathlib import Path -from typing import Optional from lightning.pytorch.callbacks import Callback, ModelCheckpoint diff --git a/src/batdetect2/train/config.py b/src/batdetect2/train/config.py index 9645af5..0fc1797 100644 --- a/src/batdetect2/train/config.py +++ b/src/batdetect2/train/config.py @@ -1,4 +1,3 @@ -from typing import Optional, Union from pydantic import Field from soundevent import data diff --git a/src/batdetect2/train/dataset.py b/src/batdetect2/train/dataset.py index 3a6a68a..309b2a6 100644 --- a/src/batdetect2/train/dataset.py +++ b/src/batdetect2/train/dataset.py @@ -1,4 +1,4 @@ -from typing import List, Optional, Sequence +from typing import List, Sequence import torch from loguru import logger diff --git a/src/batdetect2/train/labels.py b/src/batdetect2/train/labels.py index e31df53..1d83b42 100644 --- a/src/batdetect2/train/labels.py +++ b/src/batdetect2/train/labels.py @@ -6,7 +6,6 @@ the specific multi-channel heatmap formats required by the neural network. """ from functools import partial -from typing import Optional import numpy as np import torch diff --git a/src/batdetect2/train/legacy/train.py b/src/batdetect2/train/legacy/train.py index 799c4ce..bd05aa2 100644 --- a/src/batdetect2/train/legacy/train.py +++ b/src/batdetect2/train/legacy/train.py @@ -1,12 +1,12 @@ -from typing import NamedTuple, Optional +from typing import NamedTuple import torch +from batdetect2.models.types import DetectionModel from soundevent import data from torch.optim import Adam from torch.optim.lr_scheduler import CosineAnnealingLR from torch.utils.data import DataLoader -from batdetect2.models.types import DetectionModel from batdetect2.train.dataset import LabeledDataset @@ -26,7 +26,7 @@ def train_loop( learning_rate: float = 1e-4, ): train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True) - validation_loader = DataLoader(validation_dataset, batch_size=32) + DataLoader(validation_dataset, batch_size=32) model.to(device) @@ -36,8 +36,8 @@ def train_loop( num_epochs * len(train_loader), ) - for epoch in range(num_epochs): - train_loss = train_single_epoch( + for _epoch in range(num_epochs): + train_single_epoch( model, train_loader, optimizer, @@ -60,9 +60,9 @@ def train_single_epoch( optimizer.zero_grad() spec = batch.spec.to(device) - detection_heatmap = batch.detection_heatmap.to(device) - class_heatmap = batch.class_heatmap.to(device) - size_heatmap = batch.size_heatmap.to(device) + batch.detection_heatmap.to(device) + batch.class_heatmap.to(device) + batch.size_heatmap.to(device) outputs = model(spec) diff --git a/src/batdetect2/train/legacy/train_model.py b/src/batdetect2/train/legacy/train_model.py index a56ea36..f7504a4 100644 --- a/src/batdetect2/train/legacy/train_model.py +++ b/src/batdetect2/train/legacy/train_model.py @@ -2,6 +2,10 @@ import argparse import json import warnings +import batdetect2.train.audio_dataloader as adl +import batdetect2.train.evaluate as evl +import batdetect2.train.train_split as ts +import batdetect2.train.train_utils as tu import matplotlib.pyplot as plt import numpy as np import torch @@ -9,10 +13,6 @@ import torch.utils.data from torch.optim.lr_scheduler import CosineAnnealingLR import batdetect2.detector.post_process as pp -import batdetect2.train.audio_dataloader as adl -import batdetect2.train.evaluate as evl -import batdetect2.train.train_split as ts -import batdetect2.train.train_utils as tu import batdetect2.utils.plot_utils as pu from batdetect2.detector import models, parameters from batdetect2.train import losses diff --git a/src/batdetect2/train/legacy/train_split.py b/src/batdetect2/train/legacy/train_split.py index 272e8f8..31414b3 100644 --- a/src/batdetect2/train/legacy/train_split.py +++ b/src/batdetect2/train/legacy/train_split.py @@ -10,7 +10,7 @@ def get_train_test_data(ann_dir, wav_dir, split_name, load_extra=True): train_sets, test_sets = split_same(ann_dir, wav_dir, load_extra) else: print("Split not defined") - assert False + raise AssertionError() return train_sets, test_sets diff --git a/src/batdetect2/train/legacy/train_utils.py b/src/batdetect2/train/legacy/train_utils.py index fd05f3a..6c4cd26 100644 --- a/src/batdetect2/train/legacy/train_utils.py +++ b/src/batdetect2/train/legacy/train_utils.py @@ -2,7 +2,7 @@ import json import sys from collections import Counter from pathlib import Path -from typing import Dict, Generator, List, Optional, Tuple +from typing import Dict, Generator, List, Tuple import numpy as np diff --git a/src/batdetect2/train/lightning.py b/src/batdetect2/train/lightning.py index 499820b..5e1966c 100644 --- a/src/batdetect2/train/lightning.py +++ b/src/batdetect2/train/lightning.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Optional, Tuple +from typing import TYPE_CHECKING, Tuple import lightning as L import torch diff --git a/src/batdetect2/train/losses.py b/src/batdetect2/train/losses.py index bcad7a2..7b36f17 100644 --- a/src/batdetect2/train/losses.py +++ b/src/batdetect2/train/losses.py @@ -18,7 +18,6 @@ The primary entry points are: - `LossConfig`: The Pydantic model for configuring loss weights and parameters. """ -from typing import Optional import numpy as np import torch diff --git a/src/batdetect2/types.py b/src/batdetect2/types.py index 539ebe1..4c8dd4f 100644 --- a/src/batdetect2/types.py +++ b/src/batdetect2/types.py @@ -1,6 +1,6 @@ """Types used in the code base.""" -from typing import Any, List, NamedTuple, Optional, TypedDict +from typing import Any, List, NamedTuple, TypedDict import numpy as np import torch diff --git a/src/batdetect2/typing/data.py b/src/batdetect2/typing/data.py index d148af1..77f534d 100644 --- a/src/batdetect2/typing/data.py +++ b/src/batdetect2/typing/data.py @@ -1,4 +1,4 @@ -from typing import Generic, List, Optional, Protocol, Sequence, TypeVar +from typing import Generic, List, Protocol, Sequence, TypeVar from soundevent.data import PathLike diff --git a/src/batdetect2/typing/evaluate.py b/src/batdetect2/typing/evaluate.py index 54a9e71..6903af2 100644 --- a/src/batdetect2/typing/evaluate.py +++ b/src/batdetect2/typing/evaluate.py @@ -4,7 +4,6 @@ from typing import ( Generic, Iterable, List, - Optional, Protocol, Sequence, Tuple, diff --git a/src/batdetect2/typing/postprocess.py b/src/batdetect2/typing/postprocess.py index 5ba4d47..ed7b9fb 100644 --- a/src/batdetect2/typing/postprocess.py +++ b/src/batdetect2/typing/postprocess.py @@ -12,7 +12,7 @@ system that deal with model predictions. """ from dataclasses import dataclass -from typing import List, NamedTuple, Optional, Protocol, Sequence +from typing import List, NamedTuple, Protocol, Sequence import numpy as np import torch diff --git a/src/batdetect2/typing/preprocess.py b/src/batdetect2/typing/preprocess.py index 9be9990..5b52afe 100644 --- a/src/batdetect2/typing/preprocess.py +++ b/src/batdetect2/typing/preprocess.py @@ -10,7 +10,7 @@ pipeline can interact consistently, regardless of the specific underlying implementation (e.g., different libraries or custom configurations). """ -from typing import Optional, Protocol +from typing import Protocol import numpy as np import torch diff --git a/src/batdetect2/typing/targets.py b/src/batdetect2/typing/targets.py index 48db241..8dfe44f 100644 --- a/src/batdetect2/typing/targets.py +++ b/src/batdetect2/typing/targets.py @@ -13,7 +13,7 @@ throughout BatDetect2. """ from collections.abc import Callable -from typing import List, Optional, Protocol +from typing import List, Protocol import numpy as np from soundevent import data diff --git a/src/batdetect2/typing/train.py b/src/batdetect2/typing/train.py index fc3f0e9..a1e27f2 100644 --- a/src/batdetect2/typing/train.py +++ b/src/batdetect2/typing/train.py @@ -1,4 +1,4 @@ -from typing import Callable, List, NamedTuple, Protocol, Tuple +from typing import Callable, NamedTuple, Protocol, Tuple import torch from soundevent import data diff --git a/src/batdetect2/utils/audio_utils.py b/src/batdetect2/utils/audio_utils.py index e64405b..bc3b857 100644 --- a/src/batdetect2/utils/audio_utils.py +++ b/src/batdetect2/utils/audio_utils.py @@ -1,5 +1,5 @@ import warnings -from typing import Optional, Tuple +from typing import Tuple import librosa import librosa.core.spectrum diff --git a/src/batdetect2/utils/detector_utils.py b/src/batdetect2/utils/detector_utils.py index 084c5a4..c1b8e72 100644 --- a/src/batdetect2/utils/detector_utils.py +++ b/src/batdetect2/utils/detector_utils.py @@ -1,6 +1,6 @@ import json import os -from typing import Any, Iterator, List, Optional, Tuple, Union +from typing import Any, Iterator, List, Tuple import librosa import numpy as np @@ -220,7 +220,7 @@ def get_annotations_from_preds( predictions["high_freqs"], class_ind_best, class_prob_best, - predictions["det_probs"], + predictions["det_probs"], strict=False, ) ] return annotations diff --git a/src/batdetect2/utils/plot_utils.py b/src/batdetect2/utils/plot_utils.py index da4664d..e43d4d5 100644 --- a/src/batdetect2/utils/plot_utils.py +++ b/src/batdetect2/utils/plot_utils.py @@ -87,7 +87,7 @@ def save_ann_spec( y_extent = [0, duration, min_freq, max_freq] plt.close("all") - fig = plt.figure( + plt.figure( 0, figsize=(spec.shape[1] / 100, spec.shape[0] / 100), dpi=100 ) plt.imshow( @@ -369,7 +369,7 @@ def plot_pr_curve_class( # print(class_name) # plot the location of the confidence threshold values - for jj, tt in enumerate(rr["thresholds"]): + for jj, _tt in enumerate(rr["thresholds"]): ind = rr["thresholds_inds"][jj] if ind > -1: plt.plot( diff --git a/src/batdetect2/utils/tensors.py b/src/batdetect2/utils/tensors.py index 9bf77e4..4301851 100644 --- a/src/batdetect2/utils/tensors.py +++ b/src/batdetect2/utils/tensors.py @@ -1,4 +1,3 @@ -from typing import Union import numpy as np import torch diff --git a/src/batdetect2/utils/visualize.py b/src/batdetect2/utils/visualize.py index 54be1df..b7f889a 100644 --- a/src/batdetect2/utils/visualize.py +++ b/src/batdetect2/utils/visualize.py @@ -133,7 +133,7 @@ class InteractivePlotter: self.fig.canvas.mpl_connect("key_press_event", self.key_press) def mouse_hover(self, event): - vis = self.annot.get_visible() + self.annot.get_visible() if event.inaxes == self.ax[0]: cont, ind = self.low_dim_plt.contains(event) if cont: diff --git a/src/batdetect2/utils/wavfile.py b/src/batdetect2/utils/wavfile.py index 2a8232f..d611cdf 100644 --- a/src/batdetect2/utils/wavfile.py +++ b/src/batdetect2/utils/wavfile.py @@ -43,7 +43,7 @@ def _read_fmt_chunk(fid): size, comp, noc, rate, sbytes, ba, bits = res if comp not in KNOWN_WAVE_FORMATS or size > 16: comp = WAVE_FORMAT_PCM - warnings.warn("Unknown wave file format", WavFileWarning) + warnings.warn("Unknown wave file format", WavFileWarning, stacklevel=2) if size > 16: fid.read(size - 16) diff --git a/tests/test_data/test_predictions/test_parquet.py b/tests/test_data/test_predictions/test_parquet.py index 3d6da88..75ea244 100644 --- a/tests/test_data/test_predictions/test_parquet.py +++ b/tests/test_data/test_predictions/test_parquet.py @@ -5,7 +5,10 @@ import numpy as np import pytest from soundevent import data -from batdetect2.data.predictions import ParquetOutputConfig, build_output_formatter +from batdetect2.data.predictions import ( + ParquetOutputConfig, + build_output_formatter, +) from batdetect2.typing import ( BatDetect2Prediction, RawPrediction, diff --git a/tests/test_postprocessing/test_decoding.py b/tests/test_postprocessing/test_decoding.py index 6a0e642..fa57732 100644 --- a/tests/test_postprocessing/test_decoding.py +++ b/tests/test_postprocessing/test_decoding.py @@ -540,6 +540,7 @@ def test_get_prediction_features_basic(): features, ["f0", "f1", "f2"], [1.1, 2.2, 3.3], + strict=True, ): assert isinstance(feature, data.Feature) assert feature.term.name == f"batdetect2:{feat_name}" diff --git a/tests/test_postprocessing/test_extraction.py b/tests/test_postprocessing/test_extraction.py index b9de9cf..e69de29 100644 --- a/tests/test_postprocessing/test_extraction.py +++ b/tests/test_postprocessing/test_extraction.py @@ -1,2 +0,0 @@ -import numpy as np -import pytest