Coverage for biobb_pytorch / test / unitests / test_mdae / test_sensitivity_analysis.py: 100%
39 statements
« prev ^ index » next coverage.py v7.13.2, created at 2026-02-02 16:33 +0000
« prev ^ index » next coverage.py v7.13.2, created at 2026-02-02 16:33 +0000
1# type: ignore
2import numpy as np
3import pandas as pd
4from biobb_pytorch.mdae.explainability.sensitivity_analysis import make_mi_scores
7class TestSensitivityAnalysis:
8 def test_make_mi_scores_basic(self):
9 """Test make_mi_scores with basic data."""
10 # Create simple test data
11 np.random.seed(42)
12 n_samples = 100
13 n_features = 5
15 # Create DataFrame with some correlation
16 X_data = np.random.randn(n_samples, n_features)
17 y = X_data[:, 0] * 2 + X_data[:, 1] + np.random.randn(n_samples) * 0.1
19 X = pd.DataFrame(X_data, columns=[f'feature_{i}' for i in range(n_features)])
21 mi_scores = make_mi_scores(X, y, discrete_features=False)
23 # Check output type and shape
24 assert isinstance(mi_scores, pd.Series)
25 assert len(mi_scores) == n_features
26 assert mi_scores.name == "MI Scores"
28 # Check that scores are sorted in descending order
29 assert (mi_scores.values[:-1] >= mi_scores.values[1:]).all()
31 # Check that all scores are non-negative
32 assert (mi_scores.values >= 0).all()
34 def test_make_mi_scores_discrete(self):
35 """Test make_mi_scores with discrete features."""
36 np.random.seed(42)
37 n_samples = 100
38 n_features = 3
40 # Create DataFrame with discrete (categorical) and continuous features
41 # For discrete features, we need actual discrete values
42 X_data = np.random.randn(n_samples, n_features)
43 # Make first feature discrete by converting to integers
44 X_data[:, 0] = np.random.randint(0, 5, n_samples)
45 y = X_data[:, 0] + np.random.randn(n_samples) * 0.1
47 X = pd.DataFrame(X_data, columns=[f'feature_{i}' for i in range(n_features)])
49 # Mark first feature as discrete (it has integer categorical values)
50 discrete_features = [True, False, False]
52 mi_scores = make_mi_scores(X, y, discrete_features=discrete_features)
54 # Check output
55 assert isinstance(mi_scores, pd.Series)
56 assert len(mi_scores) == n_features
58 def test_make_mi_scores_column_names(self):
59 """Test that make_mi_scores preserves column names."""
60 np.random.seed(42)
61 n_samples = 50
63 feature_names = ['temperature', 'pressure', 'volume']
64 X_data = np.random.randn(n_samples, len(feature_names))
65 y = X_data[:, 0] + np.random.randn(n_samples) * 0.1
67 X = pd.DataFrame(X_data, columns=feature_names)
69 mi_scores = make_mi_scores(X, y, discrete_features=False)
71 # Check that all feature names are in the index
72 for name in feature_names:
73 assert name in mi_scores.index