File size: 1,542 Bytes
8b37c3f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import numpy as np

from src.experiments.deep import SequenceStandardizer, TF_MODEL_IDS, TORCH_MODEL_IDS


def test_sequence_standardizer_is_train_fitted_and_finite():
    X = np.array([[[1.0, np.nan], [3.0, 5.0]], [[5.0, 7.0], [7.0, 9.0]]])
    scaler = SequenceStandardizer().fit(X[:1])
    transformed = scaler.transform(X)
    assert transformed.dtype == np.float32
    assert np.isfinite(transformed).all()
    assert np.allclose(transformed[:1].mean(axis=(0, 1)), [0.0, 0.0])


def test_sequence_registry_covers_ten_models():
    assert len(TORCH_MODEL_IDS) + len(TF_MODEL_IDS) == 10


def test_physics_branch_uses_current_c_rate_channel():
    import tensorflow as tf

    from src.models.deep.itransformer import AbsCumCurrentLayer, CURRENT_CHANNEL_INDEX
    from src.utils.config import SEQUENCE_FEATURE_COLS_V3

    assert CURRENT_CHANNEL_INDEX == SEQUENCE_FEATURE_COLS_V3.index("current_c_rate")
    values = np.zeros((1, 3, len(SEQUENCE_FEATURE_COLS_V3)), dtype=np.float32)
    values[0, :, CURRENT_CHANNEL_INDEX] = [-1.0, -2.0, -3.0]
    values[0, :, SEQUENCE_FEATURE_COLS_V3.index("voltage_v")] = [4.0, 3.8, 3.6]
    observed = AbsCumCurrentLayer()(tf.constant(values)).numpy().reshape(-1)
    np.testing.assert_allclose(observed, [1.0, 3.0, 6.0])


def test_physics_itransformer_carries_configured_loss_weight():
    from src.models.deep.itransformer import build_physics_itransformer

    model = build_physics_itransformer(8, 5, d_model=8, n_heads=2, n_blocks=1, lambda_phy=0.25)
    assert model.physics_loss_weight == 0.25