FEIN / tests / test_training.py
test_training.py
Raw
import yaml
import jax
import os
import pytest


import FEIN.utils.data as data_utils
from FEIN import rnn, resnet, neural_ode
from training import run_experiment
import training.preprocess_data as data_prpr


rnn_test_configs = ['tests/experiment_configs/rnn_test_1.yml',
                    'tests/experiment_configs/rnn_test_2.yml']

resnet_test_configs = ['tests/experiment_configs/resnet_test_1.yml',
                       'tests/experiment_configs/resnet_test_2.yml']

node_test_configs = ['tests/experiment_configs/node_test_1.yml',
                     'tests/experiment_configs/node_test_2.yml']


def get_data_loader(config):
    rollout_length = config['rollout_length']
    data_key = jax.random.PRNGKey(config['data_seed']) 
    
    # Load training and validation data
    val_size = 0.15
    data_key, data_subkey = jax.random.split(data_key)
    train_trajs = data_utils.load_trajs(config['train_trajs'])
    train_data, val_data = data_prpr.construct_train_val_datasets_from_trajs(
        train_trajs, rollout_length, val_size, data_subkey
    )
    train_data_loader = data_utils.DLODataLoader(
        train_data.U_encoder,
        train_data.U_dyn,
        train_data.U_decoder,
        train_data.Y,
        data_key   
    )
    return train_data_loader


def test_rnn_model_creation():
    for  config in rnn_test_configs:
        with open(config, 'r') as file:
            config = yaml.safe_load(file)
        m = run_experiment.get_model(config)
        assert isinstance(m.dynamics, rnn.RNN)


def test_resnet_model_creation():
    for config in resnet_test_configs:
        with open(config, 'r') as file:
            config = yaml.safe_load(file)
        m = run_experiment.get_model(config)
        assert isinstance(m.dynamics, resnet.ResNet)


def test_node_model_creation():
    for  config in node_test_configs:
        with open(config, 'r') as file:
                config = yaml.safe_load(file)
        m = run_experiment.get_model(config)
        assert isinstance(m.dynamics, neural_ode.DiscretizedNODE)


def test_rnn_model_computation():
    for k, config in enumerate(rnn_test_configs):
        with open(config, 'r') as file:
            config = yaml.safe_load(file)
        if k == 0:
            data_loader = get_data_loader(config)
            batch_size = config['batch_size']
            U_enc, U_dyn, U_dec, Y = data_loader.get_batch(batch_size)

        m = run_experiment.get_model(config)
        X, Y = jax.vmap(m)(U_enc[:,0,:], U_dyn, U_dec)
        assert (X.shape[0] == batch_size and 
                X.shape[1] == config['rollout_length']+1)
        

def test_resnet_model_computation():
    for k, config in enumerate(resnet_test_configs):
        with open(config, 'r') as file:
            config = yaml.safe_load(file)
        if k == 0:
            data_loader = get_data_loader(config)
            batch_size = config['batch_size']
            U_enc, U_dyn, U_dec, Y = data_loader.get_batch(batch_size)

        m = run_experiment.get_model(config)
        X, Y = jax.vmap(m)(U_enc[:,0,:], U_dyn, U_dec)
        assert (X.shape[0] == batch_size and 
                X.shape[1] == config['rollout_length']+1)


def test_node_model_computation():
    for k, config in enumerate(node_test_configs):
        with open(config, 'r') as file:
            config = yaml.safe_load(file)
        if k == 0:
            data_loader = get_data_loader(config)
            batch_size = config['batch_size']
            U_enc, U_dyn, U_dec, Y = data_loader.get_batch(batch_size)

        m = run_experiment.get_model(config)
        X, Y = jax.vmap(m)(U_enc[:,0,:], U_dyn, U_dec)
        assert (X.shape[0] == batch_size and 
                X.shape[1] == config['rollout_length']+1)


@pytest.mark.skip(reason="Too slow")
def test_rnn_training():
    for config in rnn_test_configs:
        os.system(f"python training/run_experiment.py --wandb_mode disabled --config {config}")


@pytest.mark.skip(reason="Too slow")
def test_resnet_training():
    for config in resnet_test_configs:
        os.system(f"python training/run_experiment.py --wandb_mode disabled --config {config}")


@pytest.mark.skip(reason="Too slow")
def test_node_training():
    for config in node_test_configs:
        os.system(f"python training/run_experiment.py --wandb_mode disabled --config {config}")


if __name__ == "__main__":
    pass