From a9b3e910c442fe6108ba1973da69009450742a03 Mon Sep 17 00:00:00 2001 From: "Pim Meulensteen (DBS)" Date: Thu, 12 Mar 2026 16:18:50 +0100 Subject: [PATCH] first cleanup --- lrmodule/__init__.py | 32 +- lrmodule/lrsystem.py | 37 - lrmodule/persistence.py | 46 - lrmodule/resources/__init__.py | 0 .../lrsystem_firing_pin_impression_accf.yaml | 11 - .../characterization_test.py | 95 -- .../aperture_shear-ccf-subset.csv | 293 ------ .../score_input/aperture_shear-ccf-subset.csv | 875 ------------------ tests/conftest.py | 30 - tests/test_lrsystem.py | 7 - tests/test_persistence.py | 107 --- 11 files changed, 1 insertion(+), 1532 deletions(-) delete mode 100644 lrmodule/lrsystem.py delete mode 100644 lrmodule/persistence.py delete mode 100644 lrmodule/resources/__init__.py delete mode 100644 lrmodule/resources/lrsystem_firing_pin_impression_accf.yaml delete mode 100644 tests/characterization_test/characterization_test.py delete mode 100644 tests/characterization_test/expected_llr_output/aperture_shear-ccf-subset.csv delete mode 100644 tests/characterization_test/score_input/aperture_shear-ccf-subset.csv delete mode 100644 tests/conftest.py delete mode 100644 tests/test_lrsystem.py delete mode 100644 tests/test_persistence.py diff --git a/lrmodule/__init__.py b/lrmodule/__init__.py index 53d06ff..ea274e2 100644 --- a/lrmodule/__init__.py +++ b/lrmodule/__init__.py @@ -1,16 +1,11 @@ import pickle from pathlib import Path -import numpy as np from lir.config.lrsystem_architectures import specific_source -from lir.data.models import FeatureData, LLRData +from lir.data.models import FeatureData from lir.datasets.feature_data_csv import FeatureDataCsvFileParser from lir.lrsystems.lrsystems import LRSystem -from lrmodule import persistence -from lrmodule.data_types import ModelSettings -from lrmodule.lrsystem import get_trained_model - def get_lr_system(lr_system_folder: Path, file_name: str = "model.pkl") -> LRSystem: """ @@ -55,31 +50,6 @@ def get_reference_data(lr_system_folder: Path, file_name: str = "reference_data. return FeatureDataCsvFileParser(file=reference_data_file, label_column="hypothesis").get_instances() -def get_model(settings: ModelSettings, training_data: FeatureData, model_storage_path: Path | None) -> LRSystem: - """ - Obtain a model by loading it from disk, or by fitting it from training data. - - :param settings: model settings - :param training_data: training data - :param model_storage_path: path where trained LR models are stored - :return: a fitted LR system - """ - model = None if not model_storage_path else persistence.load_model(settings, model_storage_path) - if not model: - model = get_trained_model(settings, training_data) - if model_storage_path: - persistence.save_model(model, settings, model_storage_path) - return model - - -def calculate_llrs( - features: np.ndarray, settings: ModelSettings, training_data: FeatureData, model_storage_path: Path | None -) -> LLRData: - """Calculate LLRs after fitting a model with a training set.""" - model = get_model(settings, training_data, model_storage_path) - return model.apply(FeatureData(features=features)) - - # create an alias for the specific source system, since the architecture is identical but the name is misleading # in the current application binary_lrsystem = specific_source diff --git a/lrmodule/lrsystem.py b/lrmodule/lrsystem.py deleted file mode 100644 index 18f1e97..0000000 --- a/lrmodule/lrsystem.py +++ /dev/null @@ -1,37 +0,0 @@ -import importlib -from pathlib import Path - -import confidence -from lir.config.base import _expand -from lir.config.lrsystem_architectures import parse_lrsystem -from lir.data.models import FeatureData -from lir.lrsystems.lrsystems import LRSystem - -from lrmodule import resources as resources_package -from lrmodule.data_types import ModelSettings - - -def load_lrsystem(settings: ModelSettings) -> LRSystem: - """ - Load the LR system for the given model settings. - - :param settings: the model settings - :return: an LRSystem object - """ - filename = f"lrsystem_{settings.mark_type.value}_{settings.score_type.value}.yaml" - path = importlib.resources.files(resources_package) / filename # ty: ignore[unresolved-attribute] - if not path.exists(): - raise FileNotFoundError(path) - cfg = confidence.loadf(path) - return parse_lrsystem(_expand([], cfg), Path("lrsystem_output")) - - -def get_trained_model(settings: ModelSettings, training_data: FeatureData) -> LRSystem: - """ - Return a trained LR system. - - :param settings: settings - :param training_data: training data - :return: a trained LR system object - """ - return load_lrsystem(settings).fit(training_data) diff --git a/lrmodule/persistence.py b/lrmodule/persistence.py deleted file mode 100644 index b93e6de..0000000 --- a/lrmodule/persistence.py +++ /dev/null @@ -1,46 +0,0 @@ -import os -import pickle -from pathlib import Path - -from lir.lrsystems.lrsystems import LRSystem - -from lrmodule.data_types import ModelSettings - - -def _get_model_filename(settings: ModelSettings) -> str: - """Construct model filename based on mark and score type.""" - mark_type = settings.mark_type.value - score_type = settings.score_type.value - - return f"{mark_type}_{score_type}_model.pkl" - - -def load_model(settings: ModelSettings, model_storage_path: Path) -> LRSystem: - """Load previously cached model.""" - model_filename = _get_model_filename(settings) - model_file_path = model_storage_path / model_filename - - mark_type = settings.mark_type.value - score_type = settings.score_type.value - - if not model_file_path.exists(): - raise FileNotFoundError(f"No model found for mark type '{mark_type}', score type: '{score_type}'.") - - try: - with open(model_file_path, "rb") as f: - # It is assumed exclusively `LRSystem` models will be loaded, which are considered safe - return pickle.load(f) # noqa: S301 - except Exception: - raise RuntimeError( - f"Could not load model from .pkl file for mark type '{mark_type}', score type: '{score_type}'" - ) - - -def save_model(model: LRSystem, settings: ModelSettings, model_storage_path: Path) -> None: - """Save a model to disk.""" - model_filename = _get_model_filename(settings) - model_file_path = model_storage_path / model_filename - - os.makedirs(os.path.dirname(model_file_path), exist_ok=True) - with open(model_file_path, "wb") as f: - f.write(pickle.dumps(model)) diff --git a/lrmodule/resources/__init__.py b/lrmodule/resources/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/lrmodule/resources/lrsystem_firing_pin_impression_accf.yaml b/lrmodule/resources/lrsystem_firing_pin_impression_accf.yaml deleted file mode 100644 index d4c4bc2..0000000 --- a/lrmodule/resources/lrsystem_firing_pin_impression_accf.yaml +++ /dev/null @@ -1,11 +0,0 @@ -architecture: lrmodule.binary_lrsystem -modules: - method: bootstrap - n_bootstraps: 400 - seed: 0 - points: data - steps: - kde: - method: kde - bandwidth: silverman - elub: elub_bounder diff --git a/tests/characterization_test/characterization_test.py b/tests/characterization_test/characterization_test.py deleted file mode 100644 index 775ee00..0000000 --- a/tests/characterization_test/characterization_test.py +++ /dev/null @@ -1,95 +0,0 @@ -import csv -from collections import defaultdict -from pathlib import Path - -import numpy as np -import pytest -from lir.data.models import FeatureData, LLRData - -from lrmodule import calculate_llrs -from lrmodule.data_types import ModelSettings, MarkType, ScoreType - - -def _parse_csv_input_file(input_file_path: Path) -> dict[str, list]: - """Parse input data into dictionary which keys represent data type. - - Typically, a dictionary with the following keys is generated, due to - the nature of the data, containing evaluation scores, known match scores - and known non match scores. - { - "eval": [], - "km": [], - "knm": [], - } - """ - groups = defaultdict(list) - - with open(input_file_path) as f: - reader = csv.reader(f) - - for type_, value in reader: - groups[type_].append(float(value)) - - return groups - - -def dump_llrs(path: Path, llrs: LLRData) -> None: - with open(path, "w") as f: - writer = csv.writer(f) - for row in llrs.features: - writer.writerow(row) - - -def parse_expected_output(expected_output_file_path: Path) -> LLRData: - """Extract expected LLR data from the output file generated by Matlab code. - - The output file holds 5%-percentile, best estimate/median and 95%-percentile - LLR values. - - The function provides a list of tuples, each tuple represents the 5%-percentile, - best estimate/median and 95%-percentile LLR value. - """ - # Keep a collection of LLR_data tuples in a list, which is returned at the end - expected_llrs: list[list[float]] = [] - - with open(expected_output_file_path) as f: - reader = csv.reader(f) - - for row in reader: - expected_llrs.append([float(value) for value in row]) - - return LLRData(features=np.array(expected_llrs)) - - -@pytest.mark.parametrize( - "csv_file_name", - [ - "aperture_shear-ccf-subset.csv", # TODO: use sensible input for all model settings - ], -) -def test_characterization_test_input_output_files(csv_file_name: str): - """Check that for a given input, the expected output is provided.""" - # Given the input scores from a specific CSV - input_data = _parse_csv_input_file(Path(__file__).parent / "score_input" / csv_file_name) - evaluation_scores = np.array(input_data["eval"]) - known_match_scores = np.array(input_data["km"]) - known_non_match_scores = np.array(input_data["knm"]) - - training_scores = np.concatenate([known_match_scores, known_non_match_scores]) - training_labels = np.concatenate([np.ones_like(known_match_scores), np.zeros_like(known_non_match_scores)]) - training_data = FeatureData(features=training_scores, labels=training_labels) - - # When we use this data to obtain LLRS - model_settings = ModelSettings(MarkType.FIRING_PIN_IMPRESSION, ScoreType.ACCF) - calculated_llrs = calculate_llrs(evaluation_scores, model_settings, training_data, None) - - # If the expected output is unknown, reset this test by creating the expected output file - expected_llrs_file = Path(__file__).parent / "expected_llr_output" / csv_file_name - if not expected_llrs_file.exists(): - dump_llrs(expected_llrs_file, calculated_llrs) - pytest.skip(f"the expected LLR's were calculated and written to '{csv_file_name}'") - - # These should match the expected LLR values - expected_llrs = parse_expected_output(expected_llrs_file) - - np.testing.assert_allclose(expected_llrs.features, calculated_llrs.features) diff --git a/tests/characterization_test/expected_llr_output/aperture_shear-ccf-subset.csv b/tests/characterization_test/expected_llr_output/aperture_shear-ccf-subset.csv deleted file mode 100644 index c1af654..0000000 --- a/tests/characterization_test/expected_llr_output/aperture_shear-ccf-subset.csv +++ /dev/null @@ -1,293 +0,0 @@ -2.6599999999999997,2.630000000000001,2.7199999999999993 -2.6599999999999997,2.630000000000001,2.7199999999999993 -2.6599999999999997,2.630000000000001,2.7199999999999993 -2.6599999999999997,2.630000000000001,2.7199999999999993 -2.6599999999999997,2.630000000000001,2.7199999999999993 -2.6599999999999997,2.630000000000001,2.7199999999999993 -2.6599999999999997,2.630000000000001,2.7199999999999993 -2.6599999999999997,2.630000000000001,2.7199999999999993 -2.6599999999999997,2.630000000000001,2.7199999999999993 -2.6599999999999997,2.630000000000001,2.7199999999999993 -1.7453937895961726,0.9121245149474129,2.4666227338760223 -2.6599999999999997,2.630000000000001,2.7199999999999993 -2.6599999999999997,2.630000000000001,2.7199999999999993 --1.5,-1.62,-1.37 -2.6599999999999997,2.630000000000001,2.7199999999999993 -2.6599999999999997,2.630000000000001,2.7199999999999993 -2.6599999999999997,2.630000000000001,2.7199999999999993 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 -0.4136373190634383,-1.1392113370641095,0.8938982490586733 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --0.17629091245903067,-1.5,0.2968407450254567 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --0.19516800272818835,-1.5,0.27881677370267804 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 -0.054484532609154444,-1.3656695140736537,0.5297675613543739 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 -0.4773440135321041,-1.099042076412934,0.9584879260517425 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 -0.625072012417769,-1.0058944952645583,1.1082634529479103 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --0.3206935151122147,-1.5018385447673641,0.16415603952470348 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --0.5766811664300117,-1.5257422710654565,-0.05682787179407989 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 --1.5,-1.62,-1.37 diff --git a/tests/characterization_test/score_input/aperture_shear-ccf-subset.csv b/tests/characterization_test/score_input/aperture_shear-ccf-subset.csv deleted file mode 100644 index 8b860cc..0000000 --- a/tests/characterization_test/score_input/aperture_shear-ccf-subset.csv +++ /dev/null @@ -1,875 +0,0 @@ -eval,0.946867061 -eval,0.894119847 -eval,0.865736463 -eval,0.960045872 -eval,0.887790199 -eval,0.96529608 -eval,0.847348471 -eval,0.926385687 -eval,0.871610145 -eval,0.907835431 -eval,0.717066424 -eval,0.974115496 -eval,0.947874876 -eval,0.324447465 -eval,0.897493213 -eval,0.946774627 -eval,0.884090144 -eval,0.255603593 -eval,0.165238613 -eval,0.265628644 -eval,0.32007635 -eval,0.346501687 -eval,0.349981529 -eval,0.37674344 -eval,0.324156218 -eval,0.33176649 -eval,0.38586454 -eval,0.254652264 -eval,0.481637181 -eval,0.515840639 -eval,0.347198603 -eval,0.500947862 -eval,0.276895078 -eval,0.376278679 -eval,0.420641125 -eval,0.509429044 -eval,0.450457084 -eval,0.480967889 -eval,0.491069437 -eval,0.430838643 -eval,0.396935929 -eval,0.343024915 -eval,0.454341047 -eval,0.085222731 -eval,0.52795129 -eval,0.477030613 -eval,0.398754338 -eval,0.237517948 -eval,0.04080449 -eval,0.407066331 -eval,0.453429347 -eval,0.442454052 -eval,0.314322376 -eval,0.318936175 -eval,0.227147365 -eval,0.416242904 -eval,0.377730429 -eval,0.408170579 -eval,0.225868791 -eval,0.419728797 -eval,0.417313807 -eval,0.303698204 -eval,0.280095688 -eval,0.206289239 -eval,0.331041082 -eval,0.20348984 -eval,0.312217039 -eval,0.426109206 -eval,0.366945069 -eval,0.313226719 -eval,0.414151389 -eval,0.173085618 -eval,0.401123526 -eval,0.389035916 -eval,0.399501596 -eval,0.445006237 -eval,0.257667053 -eval,0.380313935 -eval,0.2963988 -eval,0.141922297 -eval,0.218701775 -eval,0.52072851 -eval,0.453484852 -eval,0.386972139 -eval,0.336434186 -eval,0.520923879 -eval,0.121346849 -eval,0.18402729 -eval,0.359520637 -eval,0.433227598 -eval,0.440755295 -eval,0.178086931 -eval,0.28655735 -eval,0.275497352 -eval,0.212701422 -eval,0.387622471 -eval,0.429175191 -eval,0.547723663 -eval,0.316246106 -eval,0.226466084 -eval,0.220716851 -eval,0.324370293 -eval,0.344270125 -eval,0.296923282 -eval,0.298816385 -eval,0.339377072 -eval,0.2187459 -eval,0.393623124 -eval,0.39135943 -eval,0.347303813 -eval,0.47505257 -eval,0.42937552 -eval,0.316816661 -eval,0.310339488 -eval,0.328945809 -eval,0.643197676 -eval,0.306123614 -eval,0.295109488 -eval,0.257881656 -eval,0.448970884 -eval,0.296498907 -eval,0.417218979 -eval,0.271118708 -eval,0.32271097 -eval,0.323047983 -eval,0.444153598 -eval,0.519898028 -eval,0.472253666 -eval,0.432618448 -eval,0.388821642 -eval,0.165326153 -eval,0.401134604 -eval,0.249386153 -eval,0.418737545 -eval,0.451595078 -eval,0.458573599 -eval,0.230589052 -eval,0.185088409 -eval,0.521490316 -eval,0.465993032 -eval,0.293170495 -eval,0.262398231 -eval,0.61714954 -eval,0.289579399 -eval,0.196529621 -eval,0.417957391 -eval,0.173046924 -eval,0.337031365 -eval,0.346669966 -eval,0.459017143 -eval,0.330966612 -eval,0.214297586 -eval,0.304357532 -eval,0.410784306 -eval,0.457965439 -eval,0.299168652 -eval,0.404482521 -eval,0.301157303 -eval,0.496096748 -eval,0.279006276 -eval,0.232582279 -eval,0.362177698 -eval,0.276396091 -eval,0.299592609 -eval,0.272951394 -eval,0.296471012 -eval,0.091114684 -eval,0.230407577 -eval,0.383655519 -eval,0.175546281 -eval,0.357714085 -eval,0.017955611 -eval,0.459592272 -eval,0.372597425 -eval,0.080719604 -eval,0.283056105 -eval,0.475495505 -eval,0.374616645 -eval,0.293216212 -eval,0.194801433 -eval,0.441679359 -eval,0.616372869 -eval,0.154937959 -eval,0.328612686 -eval,0.251820796 -eval,0.522640413 -eval,0.309830903 -eval,0.433007298 -eval,0.362215458 -eval,0.513563426 -eval,0.388448021 -eval,0.283859344 -eval,0.367330886 -eval,0.477789631 -eval,0.365123707 -eval,0.29222417 -eval,0.268046441 -eval,0.626893466 -eval,0.340335045 -eval,0.25303438 -eval,0.313642592 -eval,0.076891144 -eval,0.646280856 -eval,0.43374899 -eval,0.125453962 -eval,0.461907923 -eval,0.294657347 -eval,0.469407474 -eval,0.483314546 -eval,0.38485246 -eval,0.380250577 -eval,0.453105351 -eval,0.523147497 -eval,0.175995453 -eval,0.419441428 -eval,0.266448363 -eval,0.301170392 -eval,0.250818008 -eval,0.130668084 -eval,0.382386611 -eval,0.229574835 -eval,0.653717323 -eval,0.112027241 -eval,0.058567114 -eval,0.309660935 -eval,0.243319319 -eval,0.445011618 -eval,0.301805958 -eval,0.305977372 -eval,0.482107931 -eval,0.44574891 -eval,0.203359209 -eval,0.355315919 -eval,0.326926671 -eval,0.309051342 -eval,0.450706711 -eval,0.300983983 -eval,0.493259555 -eval,0.453805039 -eval,0.40463372 -eval,0.611279811 -eval,0.511184685 -eval,0.418940574 -eval,0.300913548 -eval,0.238697759 -eval,0.399339804 -eval,0.42200479 -eval,0.440705142 -eval,0.430905007 -eval,0.484740589 -eval,0.386798034 -eval,0.346505124 -eval,0.242046315 -eval,0.278040301 -eval,0.395269932 -eval,0.4215803 -eval,0.267464117 -eval,0.211203946 -eval,0.374193745 -eval,0.426028627 -eval,0.464165115 -eval,0.482856518 -eval,0.512887582 -eval,0.490281638 -eval,0.33909871 -eval,0.40069448 -eval,0.395351674 -eval,0.378575587 -eval,0.26954136 -eval,0.334176393 -eval,0.450389141 -eval,0.473791606 -eval,0.480487175 -eval,0.25525376 -eval,0.363791872 -eval,0.171903016 -eval,0.383929852 -eval,0.472536193 -eval,0.239311242 -eval,0.23407443 -eval,0.601253315 -eval,0.441596462 -eval,0.365904663 -eval,0.342610591 -eval,0.313912864 -eval,0.382778189 -eval,0.191563198 -eval,0.147820644 -eval,0.37964794 -eval,0.54105032 -eval,0.432723827 -eval,0.352502956 -eval,0.300700771 -km,0.873873981 -km,0.98139296 -km,0.941850287 -km,0.968341353 -km,0.924728741 -km,0.977440827 -km,0.928981894 -km,0.866926969 -km,0.902591165 -km,0.751463262 -km,0.971706658 -km,0.896455931 -km,0.949567753 -km,0.947273673 -km,0.957236241 -km,0.945916367 -km,0.903047876 -km,0.673550379 -km,0.739531947 -km,0.940315033 -km,0.838926033 -km,0.811425331 -km,0.915846018 -km,0.815399963 -km,0.87185657 -km,0.9422093 -km,0.866155952 -km,0.98211024 -km,0.972852205 -km,0.971075233 -km,0.96112222 -km,0.697700274 -knm,0.177904251 -knm,0.300071844 -knm,0.095405542 -knm,0.309450455 -knm,0.383976721 -knm,0.42937633 -knm,0.335323524 -knm,0.345072226 -knm,0.330454474 -knm,0.465315667 -knm,0.292083247 -knm,0.442989068 -knm,0.494112017 -knm,0.345787197 -knm,0.248020515 -knm,0.671129212 -knm,0.354750232 -knm,0.342093346 -knm,0.34929303 -knm,0.223982492 -knm,0.203086068 -knm,0.247153806 -knm,0.479343678 -knm,0.344351989 -knm,0.374970428 -knm,0.369375569 -knm,0.225625272 -knm,0.161935707 -knm,0.19055829 -knm,0.349771941 -knm,0.294100347 -knm,0.371074928 -knm,0.24881234 -knm,0.469356343 -knm,0.389865497 -knm,0.452993977 -knm,0.436093672 -knm,0.373379254 -knm,0.320507291 -knm,0.432595505 -knm,0.492698578 -knm,0.520149269 -knm,0.375363787 -knm,0.287177385 -knm,0.24691352 -knm,0.389588832 -knm,0.429742099 -knm,0.402536569 -knm,0.518387349 -knm,0.444327417 -knm,0.355835882 -knm,0.425262697 -knm,0.321888415 -knm,0.180230197 -knm,0.25801423 -knm,0.24539484 -knm,0.410534211 -knm,0.232122792 -knm,0.253214114 -knm,0.30078029 -knm,0.218405962 -knm,0.528408099 -knm,0.241704958 -knm,0.357231498 -knm,0.472483879 -knm,0.545419387 -knm,0.238494993 -knm,0.392351182 -knm,0.247126937 -knm,0.175361998 -knm,0.19978761 -knm,0.37169492 -knm,0.361390413 -knm,0.200925462 -knm,0.298229292 -knm,0.388202197 -knm,0.393720235 -knm,0.45481179 -knm,0.173630949 -knm,0.353292647 -knm,0.348491041 -knm,0.24167822 -knm,0.201957247 -knm,0.447569817 -knm,0.483072992 -knm,0.250940213 -knm,0.365978767 -knm,0.404696011 -knm,0.332673667 -knm,0.522586475 -knm,0.326111635 -knm,0.242688219 -knm,0.337717428 -knm,0.132555061 -knm,0.414585925 -knm,0.492476318 -knm,0.418565459 -knm,0.166555396 -knm,0.227024591 -knm,0.319824053 -knm,0.440598276 -knm,0.280297264 -knm,0.180214727 -knm,0.276358053 -knm,0.253072646 -knm,0.475405061 -knm,0.275138857 -knm,0.272103455 -knm,0.473795822 -knm,0.289805884 -knm,0.359094735 -knm,0.272717494 -knm,0.252032779 -knm,0.280052665 -knm,0.219644385 -knm,0.459681881 -knm,0.305768227 -knm,0.278607086 -knm,0.314950898 -knm,0.189963587 -knm,0.39311078 -knm,0.295025334 -knm,0.027648501 -knm,0.28814778 -knm,0.252843181 -knm,0.158683649 -knm,0.253581588 -knm,0.233496746 -knm,0.585652277 -knm,0.322679037 -knm,0.384257285 -knm,0.617881796 -knm,0.255725346 -knm,0.544213968 -knm,0.572354979 -knm,0.51702044 -knm,0.290764991 -knm,0.162306981 -knm,0.400503736 -knm,-0.016926837 -knm,0.427032746 -knm,0.293595118 -knm,0.466867984 -knm,0.194670671 -knm,0.2689791 -knm,0.430463189 -knm,0.212727535 -knm,0.466809447 -knm,0.275150321 -knm,0.361437899 -knm,0.256978411 -knm,0.229613456 -knm,0.46402297 -knm,0.216667425 -knm,0.170556661 -knm,0.203504112 -knm,0.478104021 -knm,0.180760665 -knm,0.197068473 -knm,0.070817599 -knm,0.395794711 -knm,0.375442012 -knm,0.199343254 -knm,0.524265574 -knm,0.53961714 -knm,0.289704276 -knm,0.481646522 -knm,0.542225597 -knm,0.366746835 -knm,0.289353227 -knm,0.282329157 -knm,0.277215194 -knm,0.194253972 -knm,0.359662449 -knm,0.298210725 -knm,0.353894002 -knm,0.388927594 -knm,0.159382579 -knm,0.304294505 -knm,0.432849894 -knm,0.361366883 -knm,0.314122302 -knm,0.160172424 -knm,0.426160355 -knm,0.158100502 -knm,0.130597474 -knm,0.279731307 -knm,0.415061798 -knm,0.507689434 -knm,0.48151346 -knm,0.293215624 -knm,0.452801341 -knm,0.414903971 -knm,0.519120183 -knm,0.366191573 -knm,0.420937252 -knm,0.558460254 -knm,0.282253111 -knm,0.31396492 -knm,0.437473194 -knm,0.556931296 -knm,0.316511718 -knm,0.330509219 -knm,0.323915216 -knm,0.329911413 -knm,0.209171369 -knm,0.406350103 -knm,0.30768015 -knm,0.665822124 -knm,0.197098669 -knm,0.423896045 -knm,0.370593501 -knm,0.350444256 -knm,0.232621599 -knm,0.444949826 -knm,0.20572267 -knm,0.366347117 -knm,0.447053437 -knm,0.256435849 -knm,0.216434461 -knm,0.387272452 -knm,0.576144917 -knm,0.539052349 -knm,0.372633967 -knm,0.379652058 -knm,0.273943767 -knm,0.441447213 -knm,0.113529892 -knm,0.549801435 -knm,0.243953669 -knm,0.209926716 -knm,0.410216913 -knm,0.366711371 -knm,0.411105282 -knm,0.310200673 -knm,0.353761523 -knm,0.236042839 -knm,0.279035701 -knm,0.114002059 -knm,0.397002095 -knm,0.189890775 -knm,0.392223627 -knm,0.388915457 -knm,0.489824167 -knm,0.509952308 -knm,0.284739041 -knm,0.213554332 -knm,0.493020921 -knm,0.357415141 -knm,0.380440423 -knm,0.442135753 -knm,0.276741054 -knm,0.302699162 -knm,0.367489769 -knm,0.441222627 -knm,0.217966999 -knm,0.23123087 -knm,0.261870758 -knm,0.569626364 -knm,0.271651358 -knm,0.518435548 -knm,0.18933127 -knm,0.489021835 -knm,0.302814228 -knm,0.605840523 -knm,0.243036865 -knm,0.280994294 -knm,0.348751961 -knm,0.165864525 -knm,0.150856649 -knm,0.269061592 -knm,0.172748378 -knm,0.236968724 -knm,0.295336776 -knm,0.269912455 -knm,0.330009299 -knm,0.409604143 -knm,0.266613875 -knm,0.304579648 -knm,0.310760495 -knm,0.122635041 -knm,0.311816839 -knm,0.253627553 -knm,0.235218585 -knm,0.434965404 -knm,0.297988008 -knm,0.401880995 -knm,0.587259853 -knm,0.295097492 -knm,0.360547568 -knm,0.237826343 -knm,0.432324561 -knm,0.277240025 -knm,0.316336246 -knm,0.340071749 -knm,0.452147308 -knm,0.260348394 -knm,0.61475815 -knm,0.392569156 -knm,0.339511978 -knm,0.172349705 -knm,0.259904412 -knm,0.402368149 -knm,0.291239001 -knm,0.612524352 -knm,0.270380968 -knm,0.187081391 -knm,0.327280254 -knm,0.521195025 -knm,0.305758658 -knm,0.425758727 -knm,0.412925912 -knm,0.412381967 -knm,0.320554251 -knm,0.462294278 -knm,0.45902528 -knm,0.484449967 -knm,0.390614888 -knm,0.303845206 -knm,0.332315888 -knm,0.382751697 -knm,0.311511243 -knm,0.163371353 -knm,0.244393992 -knm,0.308927832 -knm,0.308688586 -knm,0.205327784 -knm,0.32602624 -knm,0.329108191 -knm,0.549921792 -knm,0.238552119 -knm,0.582390864 -knm,0.5562176 -knm,0.292810654 -knm,0.245952983 -knm,0.282908875 -knm,0.420237964 -knm,0.257318789 -knm,0.215078019 -knm,0.458444351 -knm,0.442403268 -knm,0.470197625 -knm,0.466652805 -knm,0.320144032 -knm,0.229176318 -knm,0.322945222 -knm,0.361170569 -knm,0.310483291 -knm,0.339505147 -knm,0.533928089 -knm,0.486284072 -knm,0.368824535 -knm,0.284058426 -knm,0.17093918 -knm,0.566530594 -knm,0.364938045 -knm,0.311510357 -knm,0.35192647 -knm,0.335695294 -knm,0.19364411 -knm,0.51924307 -knm,0.232933578 -knm,0.236614507 -knm,0.268322673 -knm,0.343957788 -knm,0.294172999 -knm,0.271025971 -knm,0.307268462 -knm,0.306454322 -knm,0.600029144 -knm,0.178006411 -knm,0.5518938 -knm,0.27288648 -knm,0.32559789 -knm,0.355714228 -knm,0.28922964 -knm,0.38317237 -knm,0.288480682 -knm,0.496147752 -knm,0.438854606 -knm,0.332510489 -knm,0.283585593 -knm,0.264874991 -knm,0.336129918 -knm,0.284314464 -knm,0.425443644 -knm,0.26897684 -knm,0.501615405 -knm,0.613207889 -knm,0.301407424 -knm,0.238411921 -knm,0.470702307 -knm,0.216133251 -knm,0.3332678 -knm,0.163498023 -knm,0.07890812 -knm,0.37381389 -knm,0.535798279 -knm,0.009561658 -knm,0.315186421 -knm,0.300297173 -knm,0.22328846 -knm,0.253636318 -knm,0.12494246 -knm,0.518739223 -knm,0.276348071 -knm,0.165998326 -knm,0.159550054 -knm,0.526828817 -knm,0.243049505 -knm,0.433519555 -knm,0.518443156 -knm,0.278277158 -knm,0.301018319 -knm,0.340095096 -knm,0.470920972 -knm,0.357014198 -knm,0.202110377 -knm,0.089666299 -knm,0.234135846 -knm,0.226937667 -knm,0.368549152 -knm,0.341466801 -knm,0.37371211 -knm,0.12813718 -knm,0.294495206 -knm,0.352800313 -knm,0.428555457 -knm,0.439811437 -knm,0.311770728 -knm,0.241415211 -knm,0.493544973 -knm,0.255684876 -knm,0.342727993 -knm,0.278002579 -knm,0.315962826 -knm,0.29654336 -knm,0.025195325 -knm,0.336042581 -knm,0.320665846 -knm,0.168660829 -knm,0.18692152 -knm,0.236309528 -knm,0.289584785 -knm,0.440526652 -knm,0.299377435 -knm,0.528250533 -knm,0.278890728 -knm,0.19514644 -knm,0.333455973 -knm,0.181824331 -knm,0.246092273 -knm,0.20819745 -knm,0.407842316 -knm,0.267891303 -knm,0.325975643 -knm,0.271134706 -knm,0.554792607 -knm,0.284432814 -knm,0.414533551 -knm,0.284892185 -knm,0.224588179 -knm,0.340863683 -knm,0.229484961 -knm,0.412829106 -knm,0.265016045 -knm,0.174057997 -knm,0.276394293 -knm,0.357534827 -knm,0.389469549 -knm,0.378888771 -knm,0.416499259 -knm,0.139391096 -knm,0.251336034 -knm,0.392132564 -knm,0.348921698 -knm,0.193559176 -knm,0.45153897 -knm,0.309524454 -knm,0.234342926 -knm,0.179966003 -knm,0.317178649 -knm,0.316521214 -knm,0.450610764 -knm,0.304205308 -knm,0.247820261 -knm,0.383728889 -knm,0.383817057 -knm,0.580564329 -knm,0.298880231 -knm,0.516145524 -knm,0.228129746 -knm,0.244365858 -knm,0.36040617 -knm,0.291622256 -knm,0.290608806 -knm,0.425105578 -knm,0.250169425 -knm,0.319500028 -knm,0.205645412 -knm,0.395135839 -knm,0.258666037 -knm,0.401635706 -knm,0.295632099 -knm,0.38744326 -knm,0.224184358 -knm,0.493005046 -knm,0.24785314 -knm,0.461707883 -knm,0.377566662 -knm,0.245687432 -knm,0.379900042 -knm,0.42515639 -knm,0.27000563 -knm,0.323209499 -knm,0.426775186 -knm,0.401257724 -knm,0.121383739 -knm,0.152955391 -knm,0.399294952 -knm,0.176679071 -knm,0.568578201 -knm,0.396774866 -knm,0.30878986 -knm,0.404191551 -knm,0.263312852 -knm,0.438716946 -knm,0.308844238 -knm,0.419791239 -knm,0.528764075 -knm,0.298014169 -knm,0.134501173 -knm,0.229052587 -knm,0.40965361 -knm,0.246554756 -knm,0.404497228 -knm,0.302147288 -knm,0.214939188 -knm,0.426658386 -knm,0.357769914 -knm,0.40098851 -knm,0.223603122 -knm,0.398856355 -knm,0.267878858 -knm,0.471523799 -knm,0.361731979 -knm,0.213262299 -knm,0.339806794 -knm,0.418822697 -knm,0.270196282 diff --git a/tests/conftest.py b/tests/conftest.py deleted file mode 100644 index f5510f6..0000000 --- a/tests/conftest.py +++ /dev/null @@ -1,30 +0,0 @@ -import pytest -from lir.data.models import FeatureData -from lir.datasets.synthesized_normal_binary import SynthesizedNormalBinaryData, SynthesizedNormalData -from lir.lrsystems.lrsystems import LRSystem - -from lrmodule.data_types import MarkType, ModelSettings, ScoreType -from lrmodule.lrsystem import load_lrsystem - - -@pytest.fixture -def sample_feature_data() -> FeatureData: - """Provide FeatureData collection of synthesized normal binary data.""" - data = SynthesizedNormalBinaryData( - SynthesizedNormalData(mean=1, std=1, size=100), - SynthesizedNormalData(mean=-1, std=1, size=100), - seed=0, - ) - data = data.get_instances() - data = data.replace(features=data.features.flatten()) - - return data - - -@pytest.fixture -def trained_lr_system(sample_feature_data: FeatureData) -> LRSystem: - """Provide a basic trained LR system model based on specific settings and data.""" - lrsystem = load_lrsystem(ModelSettings(MarkType.FIRING_PIN_IMPRESSION, ScoreType.ACCF)) - lrsystem.fit(sample_feature_data) - - return lrsystem diff --git a/tests/test_lrsystem.py b/tests/test_lrsystem.py deleted file mode 100644 index ec3d531..0000000 --- a/tests/test_lrsystem.py +++ /dev/null @@ -1,7 +0,0 @@ -from lir.data.models import FeatureData -from lir.lrsystems.lrsystems import LRSystem - - -def test_run_lrsystem(trained_lr_system: LRSystem, sample_feature_data: FeatureData): - llrs = trained_lr_system.apply(sample_feature_data) - assert llrs.features.shape == (200, 3) diff --git a/tests/test_persistence.py b/tests/test_persistence.py deleted file mode 100644 index 0c659e6..0000000 --- a/tests/test_persistence.py +++ /dev/null @@ -1,107 +0,0 @@ -import os -import shutil -from pathlib import Path -from pickle import UnpicklingError -from unittest import mock - -import pytest -from lir.data.models import FeatureData -from lir.lrsystems.lrsystems import LRSystem - -from lrmodule import ModelSettings -from lrmodule.data_types import MarkType, ScoreType -from lrmodule.persistence import load_model, save_model, _get_model_filename - - -MODEL_STORAGE_PATH = Path(__file__).parent / "test_model_storage" - - -@pytest.fixture(autouse=True) -def clear_test_model_storage_directory(): - """Clean up 'test_model_storage' directory before running each test. - - This ensures a fresh environment for each test. The generated artifacts are not - cleaned up after each test to allow easy debugging of the generated pickle files. - """ - if MODEL_STORAGE_PATH.exists(): - shutil.rmtree(MODEL_STORAGE_PATH) - MODEL_STORAGE_PATH.mkdir(parents=True) - - -def test_serialize_trained_lr_system(trained_lr_system: LRSystem): - """Check that a trained LR system can be serialized.""" - # Given that we have a trained LR system - settings = ModelSettings(MarkType.FIRING_PIN_IMPRESSION, ScoreType.ACCF) - mark_type = settings.mark_type.value - score_type = settings.score_type.value - - # When we serialize the LR system - save_model(trained_lr_system, settings, MODEL_STORAGE_PATH) - - # There should be a file we can load - model_filename = _get_model_filename(settings) - model_file_path = MODEL_STORAGE_PATH / model_filename - assert model_file_path.exists() - - -def test_deserialize_trained_lr_system(trained_lr_system: LRSystem, sample_feature_data: FeatureData): - """Check that a deserialized, trained LR system yields exactly the same results.""" - # Given that we have a certain LR system serialized - settings = ModelSettings(MarkType.FIRING_PIN_IMPRESSION, ScoreType.ACCF) - save_model(trained_lr_system, settings, MODEL_STORAGE_PATH) - - # When the model is deserialized - deserialized_model = load_model(settings, MODEL_STORAGE_PATH) - - # The deserialized model and the model it originated from should be of the same type of LR system - assert type(trained_lr_system) == type(trained_lr_system) - - # The calculated LLR output should be identical to the LR system output of the serialized model - expected_llr_data = trained_lr_system.apply(sample_feature_data) - deserialized_model_data = deserialized_model.apply(sample_feature_data) - - assert deserialized_model_data == expected_llr_data - - -@pytest.mark.parametrize('mark_type,score_type', [ - (MarkType.FIRING_PIN_IMPRESSION, ScoreType.CMC), # other score type - (MarkType.BREECH_PIN_IMPRESSION, ScoreType.ACCF), # other mark type - (MarkType.BREECH_PIN_IMPRESSION, ScoreType.CMC), # other mark and other score type -]) -def test_deserialize_inexistent_lr_system(trained_lr_system: LRSystem, mark_type: MarkType, score_type: ScoreType): - """Check that an appropriate error is raised when there is no serialized model.""" - # Given that the LR model storage directory is empty - assert os.listdir(MODEL_STORAGE_PATH) == [] - - # Given that we have a serialized model for a given type of `ModelSettings` - settings = ModelSettings(MarkType.FIRING_PIN_IMPRESSION, ScoreType.ACCF) - save_model(trained_lr_system, settings, MODEL_STORAGE_PATH) - assert len(os.listdir(MODEL_STORAGE_PATH)) == 1 - - # When we try to deserialize a model for a different type of `ModelSettings` - other_settings = ModelSettings(mark_type, score_type) - - # An exception should be raised mentioning that we can't find that particular deserialized LR model - with pytest.raises(FileNotFoundError) as exception_info: - load_model(other_settings, MODEL_STORAGE_PATH) - - # The exception should mention no models found for the requested mark/score types - assert "No model found for mark type" in str(exception_info.value) - assert other_settings.mark_type.value in str(exception_info.value) - assert other_settings.score_type.value in str(exception_info.value) - - -def test_deserialize_from_invalid_pickle_file(trained_lr_system: LRSystem): - """Check that an appropriate error is raised when unable to unpickle serialized model.""" - # Given that we have a serialized model for a given type of `ModelSettings` - settings = ModelSettings(MarkType.FIRING_PIN_IMPRESSION, ScoreType.ACCF) - save_model(trained_lr_system, settings, MODEL_STORAGE_PATH) - - with mock.patch('pickle.load', side_effect=UnpicklingError("Some pickle error")): - # When pickle can't load the given file, we expect an appropriate error to be raised - with pytest.raises(RuntimeError) as exception_info: - load_model(settings, MODEL_STORAGE_PATH) - - assert "Could not load model from .pkl file for mark type" in str(exception_info.value) - assert settings.mark_type.value in str(exception_info.value) - assert settings.score_type.value in str(exception_info.value)