|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- from icosagon.data import Data, \
- _equal
- from icosagon.model import Model
- from icosagon.trainprep import PreparedData, \
- PreparedRelationFamily, \
- PreparedRelationType, \
- TrainValTest, \
- norm_adj_mat_one_node_type, \
- prepare_training
- import torch
- from icosagon.input import OneHotInputLayer
- from icosagon.convlayer import DecagonLayer
- from icosagon.declayer import DecodeLayer
- import pytest
-
-
- def _is_identity_function(f):
- for x in range(-100, 101):
- if f(x) != x:
- return False
- return True
-
-
- def test_model_01():
- d = Data()
- d.add_node_type('Dummy', 10)
- fam = d.add_relation_family('Dummy-Dummy', 0, 0, False)
- fam.add_relation_type('Dummy Rel', torch.rand(10, 10).round())
-
- prep_d = prepare_training(d, TrainValTest(.8, .1, .1))
-
- m = Model(prep_d)
-
- assert m.prep_d == prep_d
- assert m.layer_dimensions == [32, 64]
- assert m.keep_prob == 1.
- assert _is_identity_function(m.rel_activation)
- assert m.layer_activation == torch.nn.functional.relu
- assert _is_identity_function(m.dec_activation)
- assert m.lr == 0.001
- assert m.loss == torch.nn.functional.binary_cross_entropy_with_logits
- assert m.batch_size == 100
- assert isinstance(m.seq, torch.nn.Sequential)
- assert isinstance(m.opt, torch.optim.Optimizer)
-
-
- def test_model_02():
- d = Data()
- d.add_node_type('Dummy', 10)
- fam = d.add_relation_family('Dummy-Dummy', 0, 0, False)
- mat = torch.rand(10, 10).round().to_sparse()
- fam.add_relation_type('Dummy Rel', mat)
-
- prep_d = prepare_training(d, TrainValTest(1., 0., 0.))
-
- m = Model(prep_d)
-
- assert isinstance(m.prep_d, PreparedData)
- assert isinstance(m.prep_d.relation_families, list)
- assert len(m.prep_d.relation_families) == 1
- assert isinstance(m.prep_d.relation_families[0], PreparedRelationFamily)
- assert len(m.prep_d.relation_families[0].relation_types) == 1
- assert isinstance(m.prep_d.relation_families[0].relation_types[0], PreparedRelationType)
- assert m.prep_d.relation_families[0].relation_types[0].adjacency_matrix_backward is None
- assert torch.all(_equal(m.prep_d.relation_families[0].relation_types[0].adjacency_matrix,
- norm_adj_mat_one_node_type(mat)))
-
- assert isinstance(m.seq[0], OneHotInputLayer)
- assert isinstance(m.seq[1], DecagonLayer)
- assert isinstance(m.seq[2], DecagonLayer)
- assert isinstance(m.seq[3], DecodeLayer)
- assert len(m.seq) == 4
-
-
- def test_model_03():
- d = Data()
- d.add_node_type('Dummy', 10)
- fam = d.add_relation_family('Dummy-Dummy', 0, 0, False)
- mat = torch.rand(10, 10).round().to_sparse()
- fam.add_relation_type('Dummy Rel', mat)
-
- prep_d = prepare_training(d, TrainValTest(1., 0., 0.))
-
- m = Model(prep_d)
-
- state_dict = m.opt.state_dict()
- assert isinstance(state_dict, dict)
- # print(state_dict['param_groups'])
- # print(list(m.seq.parameters()))
- assert len(list(m.seq[0].parameters())) == 1
- assert len(list(m.seq[1].parameters())) == 1
- assert len(list(m.seq[2].parameters())) == 1
- assert len(list(m.seq[3].parameters())) == 2
- # print(list(m.seq[1].parameters()))
-
-
- def test_model_04():
- d = Data()
- d.add_node_type('Dummy', 10)
- fam = d.add_relation_family('Dummy-Dummy', 0, 0, False)
- mat = torch.rand(10, 10).round().to_sparse()
- fam.add_relation_type('Dummy Rel 1', mat)
- fam.add_relation_type('Dummy Rel 2', mat.clone())
-
- prep_d = prepare_training(d, TrainValTest(1., 0., 0.))
-
- m = Model(prep_d)
-
- assert len(list(m.seq[0].parameters())) == 1
- assert len(list(m.seq[1].parameters())) == 2
- assert len(list(m.seq[2].parameters())) == 2
- assert len(list(m.seq[3].parameters())) == 3
-
-
- def test_model_05():
- d = Data()
- d.add_node_type('Dummy', 10)
-
- fam = d.add_relation_family('Dummy-Dummy', 0, 0, False)
- mat = torch.rand(10, 10).round().to_sparse()
- fam.add_relation_type('Dummy Rel 1', mat)
- fam.add_relation_type('Dummy Rel 2', mat.clone())
-
- fam = d.add_relation_family('Dummy-Dummy 2', 0, 0, False)
- mat = torch.rand(10, 10).round().to_sparse()
- fam.add_relation_type('Dummy Rel 2-1', mat)
- fam.add_relation_type('Dummy Rel 2-2', mat.clone())
-
- prep_d = prepare_training(d, TrainValTest(1., 0., 0.))
-
- m = Model(prep_d)
-
- assert len(list(m.seq[0].parameters())) == 1
- assert len(list(m.seq[1].parameters())) == 4
- assert len(list(m.seq[2].parameters())) == 4
- assert len(list(m.seq[3].parameters())) == 6
-
-
- def test_model_06():
- d = Data()
- d.add_node_type('Dummy', 10)
- d.add_node_type('Foobar', 20)
-
- fam = d.add_relation_family('Dummy-Foobar', 0, 1, True)
- mat = torch.rand(10, 20).round().to_sparse()
- fam.add_relation_type('Dummy Rel 1', mat)
- fam.add_relation_type('Dummy Rel 2', mat.clone())
-
- fam = d.add_relation_family('Dummy-Dummy 2', 0, 0, False)
- mat = torch.rand(10, 10).round().to_sparse()
- fam.add_relation_type('Dummy Rel 2-1', mat)
- fam.add_relation_type('Dummy Rel 2-2', mat.clone())
-
- prep_d = prepare_training(d, TrainValTest(1., 0., 0.))
-
- m = Model(prep_d)
-
- assert len(list(m.seq[0].parameters())) == 2
- assert len(list(m.seq[1].parameters())) == 6
- assert len(list(m.seq[2].parameters())) == 6
- assert len(list(m.seq[3].parameters())) == 6
-
-
- def test_model_07():
- d = Data()
- d.add_node_type('Dummy', 10)
- fam = d.add_relation_family('Dummy-Dummy', 0, 0, False)
- fam.add_relation_type('Dummy Rel', torch.rand(10, 10).round())
-
- prep_d = prepare_training(d, TrainValTest(.8, .1, .1))
-
- with pytest.raises(TypeError):
- m = Model(1)
-
- with pytest.raises(TypeError):
- m = Model(prep_d, layer_dimensions=1)
-
- with pytest.raises(TypeError):
- m = Model(prep_d, ratios=1)
-
- with pytest.raises(ValueError):
- m = Model(prep_d, keep_prob='x')
-
- with pytest.raises(TypeError):
- m = Model(prep_d, rel_activation='x')
-
- with pytest.raises(TypeError):
- m = Model(prep_d, layer_activation='x')
-
- with pytest.raises(TypeError):
- m = Model(prep_d, dec_activation='x')
-
- with pytest.raises(ValueError):
- m = Model(prep_d, lr='x')
-
- with pytest.raises(TypeError):
- m = Model(prep_d, loss=1)
-
- with pytest.raises(ValueError):
- m = Model(prep_d, batch_size='x')
-
-
- def test_model_08():
- d = Data()
- d.add_node_type('Dummy', 10)
- fam = d.add_relation_family('Dummy-Dummy', 0, 0, False)
- fam.add_relation_type('Dummy Rel', torch.rand(10, 10).round())
-
- prep_d = prepare_training(d, TrainValTest(.8, .1, .1))
-
- m = Model(prep_d)
-
- m.run_epoch()
|