Passed
Pull Request — dev (#32)
by Konstantinos
64:40
created

test_so_magic   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 119
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 78
dl 0
loc 119
rs 10
c 0
b 0
f 0
wmc 8

8 Functions

Rating   Name   Duplication   Size   Complexity  
A test_somagic_scenario() 0 9 1
A test_subscriptions() 0 15 1
A so_magic_instances() 0 4 1
A test_sanity_checks_on_dataset() 0 25 1
A assert_selected_variables_are() 0 5 1
A test_somagic_objects() 0 21 1
A assert_correct_nominal_variable_encoding() 0 14 1
A assert_column_values() 0 8 1
1
import pytest
2
3
4
@pytest.fixture
5
def assert_selected_variables_are(somagic):
6
    def _assert_selected_variables_are(variables: set):
7
        assert set([x['variable'] for x in somagic._data_manager.feature_manager.feature_configuration.variables]) == variables
8
    return _assert_selected_variables_are
9
10
11
@pytest.fixture
12
def assert_column_values(test_dataset):
13
    import pandas as pd
14
15
    def _assert_column_values_are(attribute, expected_values):
16
        assert set([_ for _ in test_dataset[0].datapoints.observations[attribute]]) == set(expected_values)
17
        assert set(pd.unique(test_dataset[0].datapoints.observations[attribute])) == set(expected_values)
18
    return _assert_column_values_are
19
20
21
@pytest.fixture
22
def assert_correct_nominal_variable_encoding(test_dataset):
23
    """Test a column with each row having a string representing one of the possible values of an Attrbiute.
24
25
    Useful when an Attribute corresponds to a discreet Variable of type Nominal (ordering does not matter) and its
26
    observation (row) can have only one of the possible values.
27
    """
28
    from collections import Counter
29
30
    def _assert_nominal_variable_encoded_as_expected(expected_feature_columns):
31
        assert all(Counter([datarow[_] for _ in expected_feature_columns]) ==
32
                   Counter({0: len(expected_feature_columns) - 1, 1: 1})
33
                   for index, datarow in test_dataset[0].datapoints.observations[expected_feature_columns].iterrows())
34
    return _assert_nominal_variable_encoded_as_expected
35
36
37
def test_sanity_checks_on_dataset(test_dataset, assert_selected_variables_are, assert_column_values,
38
                                  assert_correct_nominal_variable_encoding):
39
    ATTRS2 = [f'type_{x}' for x in test_dataset[1]]
40
41
    datapoints = test_dataset[0].datapoints
42
    assert_selected_variables_are({'type', 'flavors'})
43
44
    assert all(type(x) == str for x in datapoints.observations['type'])
45
46
    assert_column_values('type', expected_values=test_dataset[1])
47
48
    assert_correct_nominal_variable_encoding(ATTRS2)
49
50
    # the below is expected because test_dataset invokes the 'one_hot_encoding_list_command' command which unfortunately
51
    # at the moment has a side effect on the attribute it operates on.
52
    # side effect: _data_manager.datapoints.observations[_attribute].fillna(value=np.nan, inplace=True)
53
    assert set([type(x) for x in datapoints.observations['flavors']]) == {list, float}
54
55
    assert len(test_dataset[2]) > 5
56
57
    assert all(x in datapoints.observations.columns for x in test_dataset[2])
58
    assert all(0 <= sum([datarow[_] for _ in test_dataset[2]]) <= test_dataset[3]
59
               for index, datarow in datapoints.observations[list(test_dataset[2])].iterrows())
60
61
    assert hasattr(test_dataset[0], 'feature_vectors')
62
63
64
@pytest.mark.parametrize('train_args', [
65
    ([6, 8, 'toroid', 'hexagonal']),
66
    # ([12, 12, 'toroid', 'rectangular'])
67
])
68
def test_somagic_scenario(train_args, somagic, test_dataset, sample_collaped_json):
69
    attrs = ('width', 'height', 'type', 'grid_type')
70
    som = somagic.map.train(*train_args[:2], maptype=train_args[2], gridtype=train_args[3])
71
    assert som.dataset_name == sample_collaped_json
72
    assert all(parameter == getattr(som, attribute) for attribute, parameter in zip(attrs, train_args))
73
74
75
@pytest.fixture
76
def so_magic_instances():
77
    from so_magic import init_so_magic
78
    return [init_so_magic(), init_so_magic()]
79
80
81
@pytest.mark.parametrize('nb_objects, nb_observers', [
82
    (2, [(1, 1, 1),
83
         (1, 1, 1)]),
84
])
85
def test_somagic_objects(nb_objects, so_magic_instances, nb_observers):
86
    assert id(so_magic_instances[0]) != id(so_magic_instances[1])
87
    assert id(so_magic_instances[0]._data_manager) != id(so_magic_instances[1]._data_manager)
88
    assert id(so_magic_instances[0]._data_manager.engine) != id(so_magic_instances[1]._data_manager.engine)
89
    assert id(so_magic_instances[0]._data_manager.engine.backend) != id(so_magic_instances[1]._data_manager.engine.backend)
90
    assert id(so_magic_instances[0]._data_manager.engine.datapoints_manager) != id(so_magic_instances[1]._data_manager.engine.datapoints_manager)
91
92
    assert id(so_magic_instances[0]._data_manager.engine.backend.datapoints_factory) != id(so_magic_instances[1]._data_manager.engine.backend.datapoints_factory)
93
    assert id(so_magic_instances[0]._data_manager.engine.backend.datapoints_factory.subject) != id(so_magic_instances[1]._data_manager.engine.backend.datapoints_factory.subject)
94
    assert id(so_magic_instances[0]._data_manager.engine.backend.datapoints_factory.subject._observers) != id(so_magic_instances[1]._data_manager.engine.backend.datapoints_factory.subject._observers)
95
96
    assert id(so_magic_instances[0]._data_manager.engine.backend.command_factory) != id(so_magic_instances[1]._data_manager.engine.backend.command_factory)
97
98
    assert so_magic_instances[0]._data_manager.phi_class != so_magic_instances[1]._data_manager.phi_class
99
    assert id(so_magic_instances[0]._data_manager.phi_class) != id(so_magic_instances[1]._data_manager.phi_class)
100
    assert id(so_magic_instances[0]._data_manager.phi_class.subject) != id(so_magic_instances[1]._data_manager.phi_class.subject)
101
    assert id(so_magic_instances[0]._data_manager.phi_class.subject._observers) != id(so_magic_instances[1]._data_manager.phi_class.subject._observers)
102
103
104
def test_subscriptions(so_magic_instances):
105
    s = so_magic_instances[0]
106
    datapoints_fact = s._data_manager.engine.backend.datapoints_factory
107
    cmd_fact = s._data_manager.engine.backend.command_factory
108
    phi_class = s._data_manager.phi_class
109
    nb_observers = (1, 1, 1)
110
    subjects = [datapoints_fact.subject,
111
                cmd_fact.subject,
112
                phi_class.subject
113
                ]
114
115
    assert datapoints_fact.subject._observers[0] == s._data_manager.engine.datapoints_manager
116
    assert cmd_fact.subject._observers[0] == s._data_manager.commands_manager.command.accumulator
117
    assert phi_class.subject._observers[0] == s._data_manager.built_phis
118
    assert all([len(subject._observers) == column for subject, column in zip(subjects, nb_observers)])
119