Skip to content
Snippets Groups Projects
Commit 750b6a8c authored by Baptiste Bauvin's avatar Baptiste Bauvin
Browse files

Added tests

parent a83236d8
No related branches found
No related tags found
No related merge requests found
...@@ -59,13 +59,6 @@ class UBoosting(metaclass=ABCMeta): ...@@ -59,13 +59,6 @@ class UBoosting(metaclass=ABCMeta):
def _validate_X_predict(self, X): def _validate_X_predict(self, X):
"""Ensure that X is in the proper format.""" """Ensure that X is in the proper format."""
if (self.base_estimator is None or
isinstance(self.base_estimator,
(BaseDecisionTree, BaseForest))):
check_array(X, accept_sparse='csr', dtype=DTYPE)
else:
check_array(X, accept_sparse=['csr', 'csc'])
if X.ndim < 2: if X.ndim < 2:
X = X[np.newaxis, :] X = X[np.newaxis, :]
if X.shape[1] != self.n_features_: if X.shape[1] != self.n_features_:
...@@ -73,8 +66,15 @@ class UBoosting(metaclass=ABCMeta): ...@@ -73,8 +66,15 @@ class UBoosting(metaclass=ABCMeta):
"match the input. Model n_features is %s and " "match the input. Model n_features is %s and "
"input n_features is %s " % (self.n_features_, X.shape[1])) "input n_features is %s " % (self.n_features_, X.shape[1]))
else: else:
mes = "Reshape your data" mes = "Reshape your data as a 2D-array "
raise ValueError(mes) raise ValueError(mes)
if (self.base_estimator is None or
isinstance(self.base_estimator,
(BaseDecisionTree, BaseForest))):
check_array(X, accept_sparse='csr', dtype=DTYPE)
else:
check_array(X, accept_sparse=['csr', 'csc'])
if X.ndim > 1: if X.ndim > 1:
if X.shape[1] != self.n_features_: if X.shape[1] != self.n_features_:
if X.shape[0] == self.n_features_ and X.shape[1] > 1: if X.shape[0] == self.n_features_ and X.shape[1] > 1:
...@@ -83,10 +83,6 @@ class UBoosting(metaclass=ABCMeta): ...@@ -83,10 +83,6 @@ class UBoosting(metaclass=ABCMeta):
raise ValueError("Number of features of the model must " raise ValueError("Number of features of the model must "
"match the input. Model n_features is %s and " "match the input. Model n_features is %s and "
"input n_features is %s " % (self.n_features_, X.shape[1])) "input n_features is %s " % (self.n_features_, X.shape[1]))
#
# raise ValueError(mes)
return X return X
def _global_X_transform(self, X, views_ind=None): def _global_X_transform(self, X, views_ind=None):
...@@ -97,10 +93,10 @@ class UBoosting(metaclass=ABCMeta): ...@@ -97,10 +93,10 @@ class UBoosting(metaclass=ABCMeta):
X_ = MultiModalSparseArray(X, views_ind) X_ = MultiModalSparseArray(X, views_ind)
else: else:
X_ = MultiModalArray(X, views_ind) X_ = MultiModalArray(X, views_ind)
if not isinstance(X_, MultiModalData): # if not isinstance(X_, MultiModalData):
try: # try:
X_ = np.asarray(X) # X_ = np.asarray(X)
X_ = MultiModalArray(X_) # X_ = MultiModalArray(X_)
except Exception as e: # except Exception as e:
raise TypeError('Reshape your data') # raise TypeError('Reshape your data')
return X_ return X_
...@@ -365,14 +365,14 @@ class MultiModalArray(np.ndarray, MultiModalData): ...@@ -365,14 +365,14 @@ class MultiModalArray(np.ndarray, MultiModalData):
views_ind.append(dat_values.shape[1] + views_ind[index]) views_ind.append(dat_values.shape[1] + views_ind[index])
index += 1 index += 1
thekeys = data.keys() thekeys = data.keys()
if new_data.ndim < 2 : # if new_data.ndim < 2 :
raise ValueError('Reshape your data') # raise ValueError('Reshape your data')
if new_data.ndim > 1 and (new_data.shape == (1, 1) or new_data.shape == ()): if new_data.ndim > 1 and (new_data.shape == (1, 1) or new_data.shape == ()):
raise ValueError('Reshape your data') raise ValueError('Reshape your data')
elif isinstance(data, np.ndarray) and views_ind is None and data.ndim == 1: elif isinstance(data, np.ndarray) and views_ind is None and data.ndim == 1:
try: try:
dat0 = np.array(data[0]) dat0 = np.array(data[0])
except Exception: except Exception: # pragma: no cover
raise TypeError("input format is not supported") raise TypeError("input format is not supported")
if dat0.ndim < 2: if dat0.ndim < 2:
...@@ -388,13 +388,13 @@ class MultiModalArray(np.ndarray, MultiModalData): ...@@ -388,13 +388,13 @@ class MultiModalArray(np.ndarray, MultiModalData):
elif (isinstance(data, np.ndarray) ) and data.ndim > 1: elif (isinstance(data, np.ndarray) ) and data.ndim > 1:
try: try:
data = np.asarray(data) data = np.asarray(data)
except: except: # pragma: no cover
raise TypeError("input format is not supported") raise TypeError("input format is not supported")
if views_ind is not None: if views_ind is not None:
try: try:
views_ind = np.asarray(views_ind) views_ind = np.asarray(views_ind)
except : except : # pragma: no cover
raise TypeError("n_views should be list or nparray") raise TypeError("n_views should be list or nparray")
elif views_ind is None: elif views_ind is None:
if data.shape[1] > 1: if data.shape[1] > 1:
...@@ -413,7 +413,7 @@ class MultiModalArray(np.ndarray, MultiModalData): ...@@ -413,7 +413,7 @@ class MultiModalArray(np.ndarray, MultiModalData):
elif not isinstance(views_ind, np.ndarray): elif not isinstance(views_ind, np.ndarray):
try: try:
views_ind = np.asarray(views_ind) views_ind = np.asarray(views_ind)
except Exception: except Exception: # pragma: no cover
raise TypeError("format of views_ind is not list or nd array") raise TypeError("format of views_ind is not list or nd array")
except Exception as e: except Exception as e:
raise ValueError('Reshape your data') raise ValueError('Reshape your data')
...@@ -421,8 +421,8 @@ class MultiModalArray(np.ndarray, MultiModalData): ...@@ -421,8 +421,8 @@ class MultiModalArray(np.ndarray, MultiModalData):
raise ValueError('Reshape your data') raise ValueError('Reshape your data')
if new_data.ndim > 1 and (new_data.shape == (1, 1) or new_data.shape == ()): if new_data.ndim > 1 and (new_data.shape == (1, 1) or new_data.shape == ()):
raise ValueError('Reshape your data') raise ValueError('Reshape your data')
if views_ind.ndim < 2 and new_data.ndim < 2 and views_ind[-1] > new_data.shape[1]: # if views_ind.ndim < 2 and new_data.ndim < 2 and views_ind[-1] > new_data.shape[1]:
raise ValueError('Reshape your data') # raise ValueError('Reshape your data')
# views_ind_self = views_ind # views_ind_self = views_ind
# if new_data.shape[1] < 1: # if new_data.shape[1] < 1:
...@@ -437,7 +437,7 @@ class MultiModalArray(np.ndarray, MultiModalData): ...@@ -437,7 +437,7 @@ class MultiModalArray(np.ndarray, MultiModalData):
# obj = ma.MaskedArray.__new(new_data) # new_data.view() a.MaskedArray(new_data, mask=new_data.mask).view(cls) # obj = ma.MaskedArray.__new(new_data) # new_data.view() a.MaskedArray(new_data, mask=new_data.mask).view(cls)
# bj = super(Metriclearn_array, cls).__new__(cls, new_data.data, new_data.mask) # bj = super(Metriclearn_array, cls).__new__(cls, new_data.data, new_data.mask)
if hasattr(new_data, "mask"): if hasattr(new_data, "mask"): # pragma: no cover
obj = ma.masked_array(new_data.data, new_data.mask).view(cls) obj = ma.masked_array(new_data.data, new_data.mask).view(cls)
elif hasattr(new_data, "data") and \ elif hasattr(new_data, "data") and \
hasattr(new_data, "shape") and len(new_data.shape) > 0: hasattr(new_data, "shape") and len(new_data.shape) > 0:
...@@ -462,7 +462,7 @@ class MultiModalArray(np.ndarray, MultiModalData): ...@@ -462,7 +462,7 @@ class MultiModalArray(np.ndarray, MultiModalData):
for dat_values in data: for dat_values in data:
try: try:
dat_values = np.array(dat_values) dat_values = np.array(dat_values)
except Exception: except Exception: # pragma: no cover
raise TypeError("input format is not supported") raise TypeError("input format is not supported")
new_data = cls._populate_new_data(index, dat_values, new_data) new_data = cls._populate_new_data(index, dat_values, new_data)
views_ind[index + 1] = dat_values.shape[1] + views_ind[index] views_ind[index + 1] = dat_values.shape[1] + views_ind[index]
...@@ -471,7 +471,8 @@ class MultiModalArray(np.ndarray, MultiModalData): ...@@ -471,7 +471,8 @@ class MultiModalArray(np.ndarray, MultiModalData):
return new_data, shapes_int, views_ind return new_data, shapes_int, views_ind
@staticmethod @staticmethod
def _populate_new_data(index, dat_values, new_data): def _populate_new_data(index, dat_values, new_data): # pragma: no cover
"""Work in progress : including missing data"""
if index == 0: if index == 0:
if isinstance(dat_values, ma.MaskedArray) or \ if isinstance(dat_values, ma.MaskedArray) or \
isinstance(dat_values, np.ndarray) or sp.issparse(dat_values): isinstance(dat_values, np.ndarray) or sp.issparse(dat_values):
...@@ -525,30 +526,32 @@ class MultiModalArray(np.ndarray, MultiModalData): ...@@ -525,30 +526,32 @@ class MultiModalArray(np.ndarray, MultiModalData):
def set_view(self, view, data): def set_view(self, view, data):
start = int(np.sum(np.asarray(self.shapes_int[0: view]))) start = int(np.sum(np.asarray(self.shapes_int[0: view])))
stop = int(start + self.shapes_int[view]) stop = int(start + self.shapes_int[view])
if stop-start == data.shape[0] and data.shape[1]== self.data.shape[1]: if stop-start == data.shape[1] and data.shape[0] == self.data.shape[0]:
self[:, start:stop] = data self[:, start:stop] = data
else: else:
raise ValueError( raise ValueError(
"shape of data does not match (%d, %d)" %stop-start %self.data.shape[1]) "shape of data does not match (%d, %d)" %(stop-start ,self.data.shape[0]))
def get_raw(self, view, raw): def get_row(self, view, row):
start = np.sum(np.asarray(self.shapes_int[0: view])) start = int(np.sum(np.asarray(self.shapes_int[0: view])))
stop = np.sum(np.asarray(self.shapes_int[0: view+1])) stop = int(np.sum(np.asarray(self.shapes_int[0: view+1])))
return self.data[start:stop, raw] return self[row, start:stop]
def add_view(self, v, data): # def add_view(self, data):
if len(self.shape) > 0: # if len(self.shape) > 0:
if data.shape[0] == self.data.shape[0]: # if data.shape[0] == self.data.shape[0]:
indice = self.shapes_int[v] # print(self.data.shape, data.shape)
np.insert(self.data, data, indice+1, axis=0) # new_data = np.hstack((self.data, data))
self.shapes_int.append(data.shape[1]) # self.shapes_int.append(data.shape[1])
self.n_views +=1 # self.n_views +=1
else: # print(new_data.shape)
raise ValueError("New view can't initialazed") #
# self.shapes_int= [data.shape[1]] # else:
# self.data.reshape(data.shape[0],) # raise ValueError("New view can't initialazed")
# np.insert(self.data, data, 0) # # self.shapes_int= [data.shape[1]]
# self.n_views = 1 # # self.data.reshape(data.shape[0],)
# # np.insert(self.data, data, 0)
# # self.n_views = 1
def _todict(self): def _todict(self):
dico = {} dico = {}
......
...@@ -124,22 +124,22 @@ class MKernel(metaclass=ABCMeta): ...@@ -124,22 +124,22 @@ class MKernel(metaclass=ABCMeta):
X = X_ X = X_
if isinstance(X, MultiModalArray): if isinstance(X, MultiModalArray):
X_ = X X_ = X
if not isinstance(X_, MultiModalArray): # if not isinstance(X_, MultiModalArray):
try: # try:
X_ = np.asarray(X) # X_ = np.asarray(X)
X_ = MultiModalArray(X_, views_ind) # X_ = MultiModalArray(X_, views_ind)
except Exception as e: # except Exception as e:
pass # pass
# raise TypeError('Reshape your data') # raise TypeError('Reshape your data')
if isinstance(X_, MultiModalArray): if isinstance(X_, MultiModalArray):
for v in range(X.n_views): for v in range(X.n_views):
if Y is not None: y = Y.get_view(v) # y = self._global_check_pairwise(X, Y, v) if Y is not None: y = Y.get_view(v) # y = self._global_check_pairwise(X, Y, v)
kernel_dict[v] = self._get_kernel(X_.get_view(v), y) kernel_dict[v] = self._get_kernel(X_.get_view(v), y)
if not isinstance(X_, MultiModalArray): # if not isinstance(X_, MultiModalArray):
if sp.sparse.issparse(X): # if sp.sparse.issparse(X):
raise TypeError("Nonsensical Error: no sparse data are allowed as input") # raise TypeError("Nonsensical Error: no sparse data are allowed as input")
raise TypeError('Reshape your data') # raise TypeError('Reshape your data')
K_ = MultiModalArray(kernel_dict) K_ = MultiModalArray(kernel_dict)
return X_, K_ return X_, K_
......
...@@ -374,6 +374,8 @@ class TestMuComboClassifier(unittest.TestCase): ...@@ -374,6 +374,8 @@ class TestMuComboClassifier(unittest.TestCase):
[ 4.49110023, 1., -2. ], [ 4.49110023, 1., -2. ],
[ 8., 2.49110023, 1. ]]]) [ 8., 2.49110023, 1. ]]])
np.testing.assert_almost_equal(label_score, expected_label_score,6) np.testing.assert_almost_equal(label_score, expected_label_score,6)
# #
# label_score = np.array( # label_score = np.array(
# [[[-1, -2, 4], [-8, 1, 4], [2, 8, -4], [2, -1, 4]], # [[[-1, -2, 4], [-8, 1, 4], [2, 8, -4], [2, -1, 4]],
......
...@@ -47,6 +47,7 @@ from multimodal.tests.datasets.get_dataset_path import get_dataset_path ...@@ -47,6 +47,7 @@ from multimodal.tests.datasets.get_dataset_path import get_dataset_path
from multimodal.datasets.data_sample import MultiModalArray from multimodal.datasets.data_sample import MultiModalArray
import pickle import pickle
class UnitaryTest(unittest.TestCase): class UnitaryTest(unittest.TestCase):
@classmethod @classmethod
...@@ -85,6 +86,44 @@ class UnitaryTest(unittest.TestCase): ...@@ -85,6 +86,44 @@ class UnitaryTest(unittest.TestCase):
array_x = a.data array_x = a.data
b = MultiModalArray(a) b = MultiModalArray(a)
np.testing.assert_equal(b.views_ind, np.array([0, 120, 240])) np.testing.assert_equal(b.views_ind, np.array([0, 120, 240]))
view_1 = np.random.randint(1,10,10)
view_2 = np.random.randint(1,10,11)
data = {0 : view_1,
1 : view_2,}
c = MultiModalArray(data)
np.testing.assert_array_equal(np.asarray(c[0,:]), np.concatenate((view_1, view_2)))
view_1 = np.random.randint(1, 10, 1)
data = {0: view_1, }
self.assertRaises(ValueError, MultiModalArray, data)
view_1 = np.array([0,])
data = view_1
d = MultiModalArray(data)
np.testing.assert_array_equal(d.views_ind, np.array([0,1]))
view_1 = [[0]]
data = view_1
self.assertRaises(ValueError, MultiModalArray, data)
view_1 = [[0,1,2 ],[0,1,2 ]]
data = view_1
d = MultiModalArray(data, [0,1])
np.testing.assert_array_equal(d.views_ind, np.array([0, 1]))
view_1 = [[0]]
data = view_1
self.assertRaises(ValueError, MultiModalArray, data)
def test_view_functions(self):
view_1 = np.random.randint(1, 10, (5, 10))
view_2 = np.random.randint(1, 10, (5, 10))
view_3 = np.random.randint(1, 10, (5, 10))
data = {0: view_1,
1: view_2, }
c = MultiModalArray(data)
c.set_view(1, view_3)
np.testing.assert_array_equal(c.get_view(1), view_3)
view_3 = np.random.randint(1, 10, (12, 10))
c = MultiModalArray(data)
self.assertRaises(ValueError, c.set_view, 1, view_3)
np.testing.assert_array_equal(c.get_row(0, 2), view_1[2, :])
if __name__ == '__main__': if __name__ == '__main__':
......
...@@ -909,6 +909,18 @@ class TestMumboClassifier(unittest.TestCase): ...@@ -909,6 +909,18 @@ class TestMumboClassifier(unittest.TestCase):
else: else:
self.assertTrue(all([issubclass(type_, csr_matrix) for type_ in types])) self.assertTrue(all([issubclass(type_, csr_matrix) for type_ in types]))
def test_validate_X_predict(self):
clf = MumboClassifier()
X = np.random.randint(1, 10, (2, 10))
y = [1, 0]
clf.fit(X, y)
X_pred = np.random.randint(1, 10, 10)
self.assertRaises(ValueError, clf._validate_X_predict, X_pred)
X_pred = np.random.randint(1,10,9)
self.assertRaises(ValueError, clf._validate_X_predict, X_pred)
X_pred = np.random.randint(1, 10, (2, 9))
self.assertRaises(ValueError, clf._validate_X_predict, X_pred)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
\ No newline at end of file
...@@ -43,6 +43,7 @@ import pickle ...@@ -43,6 +43,7 @@ import pickle
import unittest import unittest
import numpy as np import numpy as np
import scipy as sp
from sklearn.exceptions import NotFittedError from sklearn.exceptions import NotFittedError
from multimodal.datasets.data_sample import MultiModalArray from multimodal.datasets.data_sample import MultiModalArray
...@@ -271,6 +272,21 @@ class MVMLTest(unittest.TestCase): ...@@ -271,6 +272,21 @@ class MVMLTest(unittest.TestCase):
pass pass
# return check_estimator(MVML) # return check_estimator(MVML)
def test_check_kernel(self):
clf = MVML()
clf.kernel = "an_unknown_kernel"
self.assertRaises(ValueError, clf._check_kernel)
def testFitMVMLSparesArray(self):
#######################################################
# task with nparray 2d
#######################################################
x_metricl = MultiModalArray(self.kernel_dict)
x_array = np.asarray(x_metricl)
x_array_sparse = sp.sparse.csr_matrix(x_array)
mvml3 = MVML(lmbda=0.1, eta=1, nystrom_param=1.0)
self.assertRaises(TypeError, mvml3.fit, x_array_sparse, self.y, [0, 120, 240])
if __name__ == "__main__": if __name__ == "__main__":
# import sys;sys.argv = ['', 'Test.testName'] # import sys;sys.argv = ['', 'Test.testName']
unittest.main() unittest.main()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment