def test_memory_removal(self): """BUG: A particle remains in memory after its Track is resumed, leaving two copies that can independently pick up desinations, leaving two Points in the same Track in a single level.""" levels = [] levels.append([PointND(0, [1, 1]), PointND(0, [4, 1])]) # two points levels.append([PointND(1, [1, 1])]) # one vanishes, but is remembered levels.append([PointND(2, [1, 1]), PointND(2, [2, 1])]) # resume Track levels.append([PointND(3, [1, 1]), PointND(3, [2, 1]), PointND(3, [4, 1])]) t = link(levels, 5, hash_generator((10, 10), 1), memory=2) assert len(t) == 3, len(t)
def test_pathological_tracking(self): level_count = 5 p_count = 16 levels = [] shift = 1 for j in range(level_count): level = [] for k in np.arange(p_count) * 2: level.append(PointND(k // 2, (j, k + j * shift))) levels.append(level) hash_generator = lambda: Hash_table( (level_count + 1, p_count * 2 + level_count * shift + 1), .5) tracks = self.link(levels, 8, hash_generator) assert len(tracks) == p_count, len(tracks)
def test_easy_tracking(self): level_count = 5 p_count = 16 levels = [] for j in range(level_count): level = [] for k in np.arange(p_count) * 2: level.append(PointND(j, (j, k))) levels.append(level) hash_generator = lambda: Hash_table( (level_count + 1, p_count * 2 + 1), .5) tracks = self.link(levels, 1.5, hash_generator) assert len(tracks) == p_count for t in tracks: x, y = zip(*[p.pos for p in t]) dx = np.diff(x) dy = np.diff(y) assert np.sum(dx) == level_count - 1 assert np.sum(dy) == 0
import unittest import nose from numpy.testing import assert_almost_equal, assert_allclose from numpy.testing.decorators import slow from pandas.util.testing import (assert_series_equal, assert_frame_equal, assert_almost_equal) import trackpy as tp from trackpy.try_numba import NUMBA_AVAILABLE from trackpy.linking import PointND, link, Hash_table path, _ = os.path.split(os.path.abspath(__file__)) path = os.path.join(path, 'data') # Call lambda function for a fresh copy each time. unit_steps = lambda: [[PointND(t, (x, 0))] for t, x in enumerate(range(5))] np.random.seed(0) random_x = np.random.randn(5).cumsum() random_x -= random_x.min() # All x > 0 max_disp = np.diff(random_x).max() random_walk_legacy = lambda: [[PointND(t, (x, 5))] for t, x in enumerate(random_x)] def hash_generator(dims, box_size): return lambda: Hash_table(dims, box_size) def _skip_if_no_numba(): if not NUMBA_AVAILABLE: