From a868a2958dd7ea138b02543ef81cc78abf8622c7 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Fri, 15 Jan 2010 14:24:13 -0500 Subject: Rename kD splay trees to Bounding Volume Splay Trees. --- bench/libdimension/Makefile.am | 10 +-- bench/libdimension/bvst.c | 176 +++++++++++++++++++++++++++++++++++++ bench/libdimension/kD_splay_tree.c | 176 ------------------------------------- 3 files changed, 181 insertions(+), 181 deletions(-) create mode 100644 bench/libdimension/bvst.c delete mode 100644 bench/libdimension/kD_splay_tree.c (limited to 'bench') diff --git a/bench/libdimension/Makefile.am b/bench/libdimension/Makefile.am index 8b124bc..2e23fde 100644 --- a/bench/libdimension/Makefile.am +++ b/bench/libdimension/Makefile.am @@ -19,7 +19,7 @@ INCLUDES = -I$(top_srcdir)/libdimension -EXTRA_PROGRAMS = bench-array bench-geometry bench-kD_splay_tree +EXTRA_PROGRAMS = bench-array bench-geometry bench-bvst bench_array_SOURCES = array.c bench_array_LDADD = -lsandglass $(top_builddir)/libdimension/libdimension.la @@ -27,12 +27,12 @@ bench_array_LDADD = -lsandglass $(top_builddir)/libdimension/libdimension.la bench_geometry_SOURCES = geometry.c bench_geometry_LDADD = -lsandglass $(top_builddir)/libdimension/libdimension.la -bench_kD_splay_tree_SOURCES = kD_splay_tree.c -bench_kD_splay_tree_LDADD = -lsandglass $(top_builddir)/libdimension/libdimension.la +bench_bvst_SOURCES = bvst.c +bench_bvst_LDADD = -lsandglass $(top_builddir)/libdimension/libdimension.la -bench: bench-array$(EXEEXT) bench-geometry$(EXEEXT) bench-kD_splay_tree$(EXEEXT) +bench: bench-array$(EXEEXT) bench-geometry$(EXEEXT) bench-bvst$(EXEEXT) ./bench-array$(EXEEXT) ./bench-geometry$(EXEEXT) - ./bench-kD_splay_tree$(EXEEXT) + ./bench-bvst$(EXEEXT) .PHONY: bench diff --git a/bench/libdimension/bvst.c b/bench/libdimension/bvst.c new file mode 100644 index 0000000..3d363ca --- /dev/null +++ b/bench/libdimension/bvst.c @@ -0,0 +1,176 @@ +/************************************************************************* + * Copyright (C) 2009 Tavian Barnes * + * * + * This file is part of The Dimension Test Suite. * + * * + * The Dimension Test Suite is free software; you can redistribute it * + * and/or modify it under the terms of the GNU General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * The Dimension Test Suite is distributed in the hope that it will be * + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +#include "../../libdimension/dimension_impl.h" +#include +#include + +dmnsn_intersection * +dmnsn_fake_intersection_fn(const dmnsn_object *object, dmnsn_line line) +{ + dmnsn_intersection *intersection = dmnsn_new_intersection(); + intersection->t = (object->min.z - line.x0.z)/line.n.z; + intersection->texture = object->texture; + return intersection; +} + +void +dmnsn_randomize_bounding_box(dmnsn_object *object) +{ + double rand1, rand2; + + rand1 = 2.0*((double)rand())/RAND_MAX - 1.0; + rand2 = 2.0*((double)rand())/RAND_MAX - 1.0; + if (rand1 < rand2) { + object->min.x = rand1; + object->max.x = rand2; + } else { + object->max.x = rand1; + object->min.x = rand2; + } + + rand1 = 2.0*((double)rand())/RAND_MAX - 1.0; + rand2 = 2.0*((double)rand())/RAND_MAX - 1.0; + if (rand1 < rand2) { + object->min.y = rand1; + object->max.y = rand2; + } else { + object->max.y = rand1; + object->min.y = rand2; + } + + rand1 = 2.0*((double)rand())/RAND_MAX - 1.0; + rand2 = 2.0*((double)rand())/RAND_MAX - 1.0; + if (rand1 < rand2) { + object->min.z = rand1; + object->max.z = rand2; + } else { + object->max.z = rand1; + object->min.z = rand2; + } +} + +dmnsn_bvst_node * +dmnsn_bvst_deepest_recursive(dmnsn_bvst_node *node, + unsigned int depth, unsigned int *deepest) +{ + dmnsn_bvst_node *left = NULL, *right = NULL; + + if (node->contains) { + left = dmnsn_bvst_deepest_recursive(node->contains, depth + 1, deepest); + } + if (node->container) { + right = dmnsn_bvst_deepest_recursive(node->container, + depth + 1, deepest); + } + + if (right) { + return right; + } else if (left) { + return left; + } else if (depth >= *deepest) { + *deepest = depth; + return node; + } else { + return NULL; + } +} + +dmnsn_bvst_node * +dmnsn_bvst_deepest(dmnsn_bvst *tree) +{ + unsigned int deepest = 0; + return dmnsn_bvst_deepest_recursive(tree->root, 0, &deepest); +} + +int +main() +{ + dmnsn_bvst *tree; + dmnsn_bvst_node *node; + dmnsn_intersection *intersection; + dmnsn_line ray; + const unsigned int nobjects = 128; + dmnsn_object *objects[nobjects]; + unsigned int i; + long grains; + + sandglass_t sandglass; + sandglass_attributes_t attr = { SANDGLASS_MONOTONIC, SANDGLASS_CPUTIME }; + + if (sandglass_create(&sandglass, &attr, &attr) != 0) { + perror("sandglass_create()"); + return EXIT_FAILURE; + } + + tree = dmnsn_new_bvst(); + + for (i = 0; i < nobjects; ++i) { + objects[i] = dmnsn_new_object(); + if (!objects[i]) { + fprintf(stderr, "--- Couldn't allocate object! ---\n"); + return EXIT_FAILURE; + } + + /* Generate a bounding box in (-1, -1, -1), (1, 1, 1) */ + dmnsn_randomize_bounding_box(objects[i]); + objects[i]->intersection_fn = &dmnsn_fake_intersection_fn; + } + + /* dmnsn_bvst_insert() */ + + grains = 0; + for (i = 0; i < nobjects; ++i) { + sandglass_bench_noprecache(&sandglass, + dmnsn_bvst_insert(tree, objects[i])); + sandglass.grains += grains; + grains = sandglass.grains; + } + printf("dmnsn_bvst_insert(): %ld\n", sandglass.grains/nobjects); + + /* dmnsn_bvst_search() */ + + ray.x0 = dmnsn_new_vector(0.0, 0.0, -2.0); + ray.n = dmnsn_new_vector(0.0, 0.0, 1.0); + + dmnsn_delete_intersection((*objects[0]->intersection_fn)(objects[0], ray)); + sandglass_bench_noprecache(&sandglass, { + intersection = dmnsn_bvst_search(tree, ray); + }); + dmnsn_delete_intersection(intersection); + printf("dmnsn_bvst_search(): %ld\n", sandglass.grains); + + /* dmnsn_bvst_splay() */ + grains = 0; + for (i = 0; i < nobjects; ++i) { + node = dmnsn_bvst_deepest(tree); + sandglass_bench_noprecache(&sandglass, dmnsn_bvst_splay(tree, node)); + sandglass.grains += grains; + grains = sandglass.grains; + } + printf("dmnsn_bvst_splay(): %ld\n", sandglass.grains/nobjects); + + /* Cleanup */ + dmnsn_delete_bvst(tree); + for (i = 0; i < nobjects; ++i) { + dmnsn_delete_object(objects[i]); + } + + return EXIT_SUCCESS; +} diff --git a/bench/libdimension/kD_splay_tree.c b/bench/libdimension/kD_splay_tree.c deleted file mode 100644 index fffab69..0000000 --- a/bench/libdimension/kD_splay_tree.c +++ /dev/null @@ -1,176 +0,0 @@ -/************************************************************************* - * Copyright (C) 2009 Tavian Barnes * - * * - * This file is part of The Dimension Test Suite. * - * * - * The Dimension Test Suite is free software; you can redistribute it * - * and/or modify it under the terms of the GNU General Public License as * - * published by the Free Software Foundation; either version 3 of the * - * License, or (at your option) any later version. * - * * - * The Dimension Test Suite is distributed in the hope that it will be * - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *************************************************************************/ - -#include "../../libdimension/dimension_impl.h" -#include -#include - -dmnsn_intersection * -dmnsn_fake_intersection_fn(const dmnsn_object *object, dmnsn_line line) -{ - dmnsn_intersection *intersection = dmnsn_new_intersection(); - intersection->t = (object->min.z - line.x0.z)/line.n.z; - intersection->texture = object->texture; - return intersection; -} - -void -dmnsn_randomize_bounding_box(dmnsn_object *object) -{ - double rand1, rand2; - - rand1 = 2.0*((double)rand())/RAND_MAX - 1.0; - rand2 = 2.0*((double)rand())/RAND_MAX - 1.0; - if (rand1 < rand2) { - object->min.x = rand1; - object->max.x = rand2; - } else { - object->max.x = rand1; - object->min.x = rand2; - } - - rand1 = 2.0*((double)rand())/RAND_MAX - 1.0; - rand2 = 2.0*((double)rand())/RAND_MAX - 1.0; - if (rand1 < rand2) { - object->min.y = rand1; - object->max.y = rand2; - } else { - object->max.y = rand1; - object->min.y = rand2; - } - - rand1 = 2.0*((double)rand())/RAND_MAX - 1.0; - rand2 = 2.0*((double)rand())/RAND_MAX - 1.0; - if (rand1 < rand2) { - object->min.z = rand1; - object->max.z = rand2; - } else { - object->max.z = rand1; - object->min.z = rand2; - } -} - -dmnsn_kD_splay_node * -dmnsn_kD_splay_deepest_recursive(dmnsn_kD_splay_node *node, - unsigned int depth, unsigned int *deepest) -{ - dmnsn_kD_splay_node *left = NULL, *right = NULL; - - if (node->contains) { - left = dmnsn_kD_splay_deepest_recursive(node->contains, depth + 1, deepest); - } - if (node->container) { - right = dmnsn_kD_splay_deepest_recursive(node->container, - depth + 1, deepest); - } - - if (right) { - return right; - } else if (left) { - return left; - } else if (depth >= *deepest) { - *deepest = depth; - return node; - } else { - return NULL; - } -} - -dmnsn_kD_splay_node * -dmnsn_kD_splay_deepest(dmnsn_kD_splay_tree *tree) -{ - unsigned int deepest = 0; - return dmnsn_kD_splay_deepest_recursive(tree->root, 0, &deepest); -} - -int -main() -{ - dmnsn_kD_splay_tree *tree; - dmnsn_kD_splay_node *node; - dmnsn_intersection *intersection; - dmnsn_line ray; - const unsigned int nobjects = 128; - dmnsn_object *objects[nobjects]; - unsigned int i; - long grains; - - sandglass_t sandglass; - sandglass_attributes_t attr = { SANDGLASS_MONOTONIC, SANDGLASS_CPUTIME }; - - if (sandglass_create(&sandglass, &attr, &attr) != 0) { - perror("sandglass_create()"); - return EXIT_FAILURE; - } - - tree = dmnsn_new_kD_splay_tree(); - - for (i = 0; i < nobjects; ++i) { - objects[i] = dmnsn_new_object(); - if (!objects[i]) { - fprintf(stderr, "--- Couldn't allocate object! ---\n"); - return EXIT_FAILURE; - } - - /* Generate a bounding box in (-1, -1, -1), (1, 1, 1) */ - dmnsn_randomize_bounding_box(objects[i]); - objects[i]->intersection_fn = &dmnsn_fake_intersection_fn; - } - - /* dmnsn_kD_splay_insert() */ - - grains = 0; - for (i = 0; i < nobjects; ++i) { - sandglass_bench_noprecache(&sandglass, - dmnsn_kD_splay_insert(tree, objects[i])); - sandglass.grains += grains; - grains = sandglass.grains; - } - printf("dmnsn_kD_splay_insert(): %ld\n", sandglass.grains/nobjects); - - /* dmnsn_kD_splay_search() */ - - ray.x0 = dmnsn_new_vector(0.0, 0.0, -2.0); - ray.n = dmnsn_new_vector(0.0, 0.0, 1.0); - - dmnsn_delete_intersection((*objects[0]->intersection_fn)(objects[0], ray)); - sandglass_bench_noprecache(&sandglass, { - intersection = dmnsn_kD_splay_search(tree, ray); - }); - dmnsn_delete_intersection(intersection); - printf("dmnsn_kD_splay_search(): %ld\n", sandglass.grains); - - /* dmnsn_kD_splay() */ - grains = 0; - for (i = 0; i < nobjects; ++i) { - node = dmnsn_kD_splay_deepest(tree); - sandglass_bench_noprecache(&sandglass, dmnsn_kD_splay(tree, node)); - sandglass.grains += grains; - grains = sandglass.grains; - } - printf("dmnsn_kD_splay(): %ld\n", sandglass.grains/nobjects); - - /* Cleanup */ - dmnsn_delete_kD_splay_tree(tree); - for (i = 0; i < nobjects; ++i) { - dmnsn_delete_object(objects[i]); - } - - return EXIT_SUCCESS; -} -- cgit v1.2.3