Exemple #1
0
def test_compressed_octree_has_lesser_depth_than_octree():
    N = 50
    x, y, z = np.mgrid[0:1:N * 1j, 0:1:N * 1j, 0:1:N * 1j]
    x = x.ravel()
    y = y.ravel()
    z = z.ravel()
    h = np.ones_like(x)

    pa = get_particle_array(x=x, y=y, z=z, h=h)

    x1 = np.array([20])
    y1 = np.array([20])
    z1 = np.array([20])

    # For a dataset where one particle is far away from a
    # cluster of particles
    pa.add_particles(x=x1, y=y1, z=z1)
    tree = Octree(10)
    comp_tree = CompressedOctree(10)

    depth_tree = tree.build_tree(pa)
    depth_comp_tree = comp_tree.build_tree(pa)

    # Test that the depth of compressed octree for the same
    # leaf_max_particles is lesser than that of octree
    assert depth_comp_tree < depth_tree
Exemple #2
0
def test_single_level_octree():
    N = 50
    x, y, z = np.mgrid[0:1:N * 1j, 0:1:N * 1j, 0:1:N * 1j]
    x = x.ravel()
    y = y.ravel()
    z = z.ravel()
    h = np.ones_like(x)

    pa = get_particle_array(x=x, y=y, z=z, h=h)

    # For maximum leaf particles greater that total number
    # of particles
    tree = Octree(pa.get_number_of_particles() + 1)
    tree.build_tree(pa)
    # Test that depth of the tree is 1
    assert tree.depth == 1
Exemple #3
0
class SimpleOctreeTestCase(unittest.TestCase):
    """Simple test case for Octree
    """
    def setUp(self):
        N = 50
        x, y, z = np.mgrid[0:1:N * 1j, 0:1:N * 1j, 0:1:N * 1j]
        self.x = x.ravel()
        self.y = y.ravel()
        self.z = z.ravel()
        self.h = np.ones_like(self.x)

        self.tree = Octree(10)

    def test_levels_in_tree(self):
        pa = get_particle_array(x=self.x, y=self.y, z=self.z, h=self.h)
        self.tree.build_tree(pa)
        root = self.tree.get_root()

        def _check_levels(node, level):
            # Test that levels for nodes are correctly set
            # starting from 0 at root
            self.assertTrue(node.level == level)
            children = node.get_children()
            for child in children:
                if child == None:
                    continue
                _check_levels(child, level + 1)

        _check_levels(root, 0)
        self.tree.delete_tree()

    def test_parent_for_node(self):
        pa = get_particle_array(x=self.x, y=self.y, z=self.z, h=self.h)
        self.tree.build_tree(pa)
        root = self.tree.get_root()
        # Test that parent of root is 'None'
        self.assertTrue(root.get_parent() == None)

        def _check_parent(node):
            children = node.get_children()
            for child in children:
                if child == None:
                    continue
                # Test that the parent is set correctly for all nodes
                self.assertTrue(child.get_parent() == node)
                _check_parent(child)

        _check_parent(root)
        self.tree.delete_tree()

    def test_sum_of_indices_lengths_equals_total_number_of_particles(self):
        pa = get_particle_array(x=self.x, y=self.y, z=self.z, h=self.h)
        self.tree.build_tree(pa)
        root = self.tree.get_root()
        sum_indices = [0]

        def _calculate_sum(node, sum_indices):
            indices = node.get_indices(self.tree)
            sum_indices[0] += indices.length
            children = node.get_children()
            for child in children:
                if child == None:
                    continue
                _calculate_sum(child, sum_indices)

        _calculate_sum(root, sum_indices)
        # Test that sum of lengths of all indices is equal to total
        # number of particles
        self.assertTrue(pa.get_number_of_particles() == sum_indices[0])
        self.tree.delete_tree()

    def test_plot_root(self):
        pa = get_particle_array(x=self.x, y=self.y, z=self.z, h=self.h)
        self.tree.build_tree(pa)
        root = self.tree.get_root()
        mpl = importorskip("matplotlib")
        mpl.use('Agg')
        import matplotlib.pyplot as plt
        from mpl_toolkits.mplot3d import Axes3D
        fig = plt.figure()
        ax = Axes3D(fig)

        root.plot(ax)

        for line in ax.lines:
            xs = line.get_xdata()
            ys = line.get_ydata()
            line_length = (xs[0] - xs[1])**2 + (ys[0] - ys[1])**2
            # Test that the lengths of sides 2D projection of the node
            # is equal to the length of the side of the node
            self.assertTrue(line_length == root.length**2 or \
                    line_length == 0)

        self.tree.delete_tree()