Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 20 additions & 10 deletions khiva/distances.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,7 @@ def euclidean(tss):
between time series 0 and time series 1.
"""
b = ctypes.c_void_p(0)
KhivaLibrary().c_khiva_library.euclidean(ctypes.pointer(tss.arr_reference),
ctypes.pointer(b))
KhivaLibrary().c_khiva_library.euclidean(ctypes.pointer(tss.arr_reference), ctypes.pointer(b))
return Array(array_reference=b)


Expand All @@ -43,8 +42,7 @@ def dtw(tss):
distance between time series 0 and time series 1.
"""
b = ctypes.c_void_p(0)
KhivaLibrary().c_khiva_library.dtw(ctypes.pointer(tss.arr_reference),
ctypes.pointer(b))
KhivaLibrary().c_khiva_library.dtw(ctypes.pointer(tss.arr_reference), ctypes.pointer(b))
return Array(array_reference=b)


Expand All @@ -58,8 +56,7 @@ def hamming(tss):
between time series 0 and time series 1.
"""
b = ctypes.c_void_p(0)
KhivaLibrary().c_khiva_library.hamming(ctypes.pointer(tss.arr_reference),
ctypes.pointer(b))
KhivaLibrary().c_khiva_library.hamming(ctypes.pointer(tss.arr_reference), ctypes.pointer(b))
return Array(array_reference=b)


Expand All @@ -73,8 +70,22 @@ def manhattan(tss):
between time series 0 and time series 1.
"""
b = ctypes.c_void_p(0)
KhivaLibrary().c_khiva_library.manhattan(ctypes.pointer(tss.arr_reference),
ctypes.pointer(b))
KhivaLibrary().c_khiva_library.manhattan(ctypes.pointer(tss.arr_reference), ctypes.pointer(b))
return Array(array_reference=b)


def sbd(tss):
""" Calculates the Shape-Based distance (SBD). It computes the normalized cross-correlation and
it returns the value that maximizes the correlation value between time series.

:param tss: Expects an input array whose dimension zero is the length of the time series (all the same) and
dimension one indicates the number of time series.
:return: Array with an upper triangular matrix where each position corresponds to the distance between two time series.
Diagonal elements will be zero. For example: Position row 0 column 1 records the distance between time series 0
and time series 1.
"""
b = ctypes.c_void_p(0)
KhivaLibrary().c_khiva_library.sbd(ctypes.pointer(tss.arr_reference), ctypes.pointer(b))
return Array(array_reference=b)


Expand All @@ -88,6 +99,5 @@ def squared_euclidean(tss):
and time series 1.
"""
b = ctypes.c_void_p(0)
KhivaLibrary().c_khiva_library.squared_euclidean(ctypes.pointer(tss.arr_reference),
ctypes.pointer(b))
KhivaLibrary().c_khiva_library.squared_euclidean(ctypes.pointer(tss.arr_reference), ctypes.pointer(b))
return Array(array_reference=b)
18 changes: 12 additions & 6 deletions tests/unit_tests/distances_unit_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,6 @@ def test_euclidean(self):
expected = np.array([0, 0, 0, 8, 0, 0, 16, 8, 0])
np.testing.assert_array_almost_equal(euclidean_result, expected, decimal=1)

def test_squared_euclidean(self):
squared_euclidean_result = squared_euclidean(
Array(data=[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]])).to_numpy().flatten()
expected = np.array([0, 0, 0, 64, 0, 0, 256, 64, 0])
np.testing.assert_array_almost_equal(squared_euclidean_result, expected, decimal=1)

def test_dtw(self):
euclidean_result = dtw(Array(
data=[[1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5]])).to_numpy()
Expand All @@ -55,6 +49,18 @@ def test_manhattan(self):
expected = np.array([[0, 0, 0, 0, 0], [5, 0, 0, 0, 0], [10, 5, 0, 0, 0], [15, 10, 5, 0, 0], [20, 15, 10, 5, 0]])
np.testing.assert_array_almost_equal(result, expected, decimal=2)

def test_sbd(self):
sbd_result = sbd(
Array(data=[[1, 2, 3, 4, 5], [1, 1, 0, 1, 1], [10, 12, 0, 0, 1]])).to_numpy().flatten()
expected = np.array([0, 0, 0, 0.505025, 0, 0, 0.458583, 0.564093, 0])
np.testing.assert_array_almost_equal(sbd_result, expected, decimal=1)

def test_squared_euclidean(self):
squared_euclidean_result = squared_euclidean(
Array(data=[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]])).to_numpy().flatten()
expected = np.array([0, 0, 0, 64, 0, 0, 256, 64, 0])
np.testing.assert_array_almost_equal(squared_euclidean_result, expected, decimal=1)


Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove this empty line

if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(DistancesTest)
Expand Down