static void rtree_test_main(SkRTree* rtree, skiatest::Reporter* reporter) { DataRect rects[NUM_RECTS]; SkRandom rand; REPORTER_ASSERT(reporter, NULL != rtree); int expectedDepthMin = -1; int expectedDepthMax = -1; int tmp = NUM_RECTS; while (tmp > 0) { tmp -= static_cast<int>(pow(static_cast<double>(MAX_CHILDREN), static_cast<double>(expectedDepthMin + 1))); ++expectedDepthMin; } tmp = NUM_RECTS; while (tmp > 0) { tmp -= static_cast<int>(pow(static_cast<double>(MIN_CHILDREN), static_cast<double>(expectedDepthMax + 1))); ++expectedDepthMax; } for (size_t i = 0; i < NUM_ITERATIONS; ++i) { random_data_rects(rand, rects, NUM_RECTS); // First try bulk-loaded inserts for (int i = 0; i < NUM_RECTS; ++i) { rtree->insert(rects[i].data, rects[i].rect, true); } rtree->flushDeferredInserts(); run_queries(reporter, rand, rects, *rtree); REPORTER_ASSERT(reporter, NUM_RECTS == rtree->getCount()); REPORTER_ASSERT(reporter, expectedDepthMin <= rtree->getDepth() && expectedDepthMax >= rtree->getDepth()); rtree->clear(); REPORTER_ASSERT(reporter, 0 == rtree->getCount()); // Then try immediate inserts for (int i = 0; i < NUM_RECTS; ++i) { rtree->insert(rects[i].data, rects[i].rect); } run_queries(reporter, rand, rects, *rtree); REPORTER_ASSERT(reporter, NUM_RECTS == rtree->getCount()); REPORTER_ASSERT(reporter, expectedDepthMin <= rtree->getDepth() && expectedDepthMax >= rtree->getDepth()); rtree->clear(); REPORTER_ASSERT(reporter, 0 == rtree->getCount()); // And for good measure try immediate inserts, but in reversed order for (int i = NUM_RECTS - 1; i >= 0; --i) { rtree->insert(rects[i].data, rects[i].rect); } run_queries(reporter, rand, rects, *rtree); REPORTER_ASSERT(reporter, NUM_RECTS == rtree->getCount()); REPORTER_ASSERT(reporter, expectedDepthMin <= rtree->getDepth() && expectedDepthMax >= rtree->getDepth()); rtree->clear(); REPORTER_ASSERT(reporter, 0 == rtree->getCount()); } }
DEF_TEST(RTree, reporter) { int expectedDepthMin = -1; int tmp = NUM_RECTS; while (tmp > 0) { tmp -= static_cast<int>(pow(static_cast<double>(SkRTree::kMaxChildren), static_cast<double>(expectedDepthMin + 1))); ++expectedDepthMin; } int expectedDepthMax = -1; tmp = NUM_RECTS; while (tmp > 0) { tmp -= static_cast<int>(pow(static_cast<double>(SkRTree::kMinChildren), static_cast<double>(expectedDepthMax + 1))); ++expectedDepthMax; } SkRandom rand; SkAutoTMalloc<SkRect> rects(NUM_RECTS); for (size_t i = 0; i < NUM_ITERATIONS; ++i) { SkRTree rtree; REPORTER_ASSERT(reporter, 0 == rtree.getCount()); for (int j = 0; j < NUM_RECTS; j++) { rects[j] = random_rect(rand); } rtree.insert(rects.get(), NUM_RECTS); SkASSERT(rects); // SkRTree doesn't take ownership of rects. run_queries(reporter, rand, rects, rtree); REPORTER_ASSERT(reporter, NUM_RECTS == rtree.getCount()); REPORTER_ASSERT(reporter, expectedDepthMin <= rtree.getDepth() && expectedDepthMax >= rtree.getDepth()); } }
static void tree_test_main(SkBBoxHierarchy* tree, int minChildren, int maxChildren, skiatest::Reporter* reporter) { DataRect rects[NUM_RECTS]; SkRandom rand; REPORTER_ASSERT(reporter, NULL != tree); int expectedDepthMin = -1; int expectedDepthMax = -1; int tmp = NUM_RECTS; if (maxChildren > 0) { while (tmp > 0) { tmp -= static_cast<int>(pow(static_cast<double>(maxChildren), static_cast<double>(expectedDepthMin + 1))); ++expectedDepthMin; } } tmp = NUM_RECTS; if (minChildren > 0) { while (tmp > 0) { tmp -= static_cast<int>(pow(static_cast<double>(minChildren), static_cast<double>(expectedDepthMax + 1))); ++expectedDepthMax; } } for (size_t i = 0; i < NUM_ITERATIONS; ++i) { random_data_rects(rand, rects, NUM_RECTS); // First try bulk-loaded inserts for (int i = 0; i < NUM_RECTS; ++i) { tree->insert(rects[i].data, rects[i].rect, true); } tree->flushDeferredInserts(); run_queries(reporter, rand, rects, *tree); REPORTER_ASSERT(reporter, NUM_RECTS == tree->getCount()); REPORTER_ASSERT(reporter, ((expectedDepthMin <= 0) || (expectedDepthMin <= tree->getDepth())) && ((expectedDepthMax <= 0) || (expectedDepthMax >= tree->getDepth()))); tree->clear(); REPORTER_ASSERT(reporter, 0 == tree->getCount()); // Then try immediate inserts for (int i = 0; i < NUM_RECTS; ++i) { tree->insert(rects[i].data, rects[i].rect); } run_queries(reporter, rand, rects, *tree); REPORTER_ASSERT(reporter, NUM_RECTS == tree->getCount()); REPORTER_ASSERT(reporter, ((expectedDepthMin <= 0) || (expectedDepthMin <= tree->getDepth())) && ((expectedDepthMax <= 0) || (expectedDepthMax >= tree->getDepth()))); tree->clear(); REPORTER_ASSERT(reporter, 0 == tree->getCount()); // And for good measure try immediate inserts, but in reversed order for (int i = NUM_RECTS - 1; i >= 0; --i) { tree->insert(rects[i].data, rects[i].rect); } run_queries(reporter, rand, rects, *tree); REPORTER_ASSERT(reporter, NUM_RECTS == tree->getCount()); REPORTER_ASSERT(reporter, ((expectedDepthMin < 0) || (expectedDepthMin <= tree->getDepth())) && ((expectedDepthMax < 0) || (expectedDepthMax >= tree->getDepth()))); tree->clear(); REPORTER_ASSERT(reporter, 0 == tree->getCount()); } }
int main(int argc, const char *const argv[]) { PGconn *conn; PGresult *result; int ret; GNUNET_log_setup ("test-pq", "WARNING", NULL); conn = PQconnectdb ("postgres:///gnunetcheck"); if (CONNECTION_OK != PQstatus (conn)) { fprintf (stderr, "Cannot run test, database connection failed: %s\n", PQerrorMessage (conn)); GNUNET_break (0); PQfinish (conn); return 0; /* We ignore this type of error... */ } result = PQexec (conn, "CREATE TEMPORARY TABLE IF NOT EXISTS test_pq (" " pub BYTEA NOT NULL" ",sig BYTEA NOT NULL" ",abs_time INT8 NOT NULL" ",forever INT8 NOT NULL" ",hash BYTEA NOT NULL CHECK(LENGTH(hash)=64)" ",vsize VARCHAR NOT NULL" ",u16 INT2 NOT NULL" ",u32 INT4 NOT NULL" ",u64 INT8 NOT NULL" ")"); if (PGRES_COMMAND_OK != PQresultStatus (result)) { fprintf (stderr, "Failed to create table: %s\n", PQerrorMessage (conn)); PQclear (result); PQfinish (conn); return 1; } PQclear (result); if (GNUNET_OK != postgres_prepare (conn)) { GNUNET_break (0); PQfinish (conn); return 1; } ret = run_queries (conn); result = PQexec (conn, "DROP TABLE test_pq"); if (PGRES_COMMAND_OK != PQresultStatus (result)) { fprintf (stderr, "Failed to create table: %s\n", PQerrorMessage (conn)); PQclear (result); PQfinish (conn); return 1; } PQclear (result); PQfinish (conn); return ret; }
void mexFunction( int nlhs, mxArray **plhs, int nrhs, const mxArray **prhs){ Tree *tree; double *reference, *model; int *index, i; unsigned int N, D, M; double *closest_pts, *distances, *pointer_to_tree; int SkipQueries=0; if (nrhs <2 ){ mexErrMsgTxt("Must have at least two input arrays."); } #ifdef DEBUG mexPrintf("Mex function called with %d inputs and %d explicit outputs\n",nrhs,nlhs); #endif reference = mxGetPr(prhs[0]); N = mxGetM(prhs[0]); D = mxGetN(prhs[0]); if ((!N || !D ) && ( nrhs < 3) ) mexErrMsgTxt("You have to supply some reference points to build a k-D tree."); #ifdef TIME gettimeofday(&tv1,&tz); #endif // // // If the tree is not passed in as a third input, we must build it // // if (nrhs < 3 ){ #ifdef DEBUG mexPrintf("----------------------\n"); mexPrintf("Building k-D Tree ...\n"); #endif index = (int*) malloc( sizeof(int) * N); for (i=0; i < N; i++) index[i]=i; if ( (tree = build_kdtree(reference,N,D,index,N,0))==NULL ){ free(index); mexErrMsgTxt("Not enough free memory to build k-D tree\n"); } else { tree->dims = D; free(index); } #ifdef DEBUG mexPrintf("Done Building k-D Tree\n"); mexPrintf("----------------------\n"); #endif } else { // // The tree was built previously, and is now being passed in to the function. // // // The tree was built previously, and is now being passed in to the function. // if ( (pointer_to_tree = mxGetPr(prhs[2])) == NULL ) mexErrMsgTxt("Third argument is not a valid pointer to a k-D tree\n"); if ( (tree = (Tree *) ((long) pointer_to_tree[0]))== NULL ) mexErrMsgTxt("Third argument is not a valid pointer to a k-D tree\n"); } #ifdef TIME gettimeofday(&tv2,&tz); if (tv2.tv_usec - tv1.tv_usec < 0) { tv2.tv_sec--; tv2.tv_usec += 1000000; } mexPrintf("Time to Build Tree : %f\n", tv2.tv_sec -tv1.tv_sec+(tv2.tv_usec-tv1.tv_usec)/1000000.0); #endif #ifdef DISPLAY_TREE mexPrintf("\nDepth first traversal of the k-D tree\n"); mexPrintf("-------------------------------------\n"); display_tree(tree->rootptr,D); mexPrintf("-------------------------------------\n"); #endif // // Query section // // model = mxGetPr(prhs[1]); M = mxGetM(prhs[1]); if (!model && !M) { // There are no points to query SkipQueries=1; } else { // Check that the model points are of the same dimension as the // reference points in the k-d tree. if (mxGetN(prhs[1]) != tree->dims) mexErrMsgTxt("Reference and Model Vectors must be of the same dimension"); } if (nlhs >=0){ plhs[0] = mxCreateDoubleMatrix(M, tree->dims,mxREAL); closest_pts = mxGetPr(plhs[0]); } else{ closest_pts = (double *) malloc (sizeof(double) *M* (tree->dims)); } if (nlhs >=2) { plhs[1] = mxCreateDoubleMatrix(M,1,mxREAL); distances = mxGetPr(plhs[1]); } else { distances = (double *) malloc (sizeof(double)*M); } if (nlhs >=3) { plhs[2] = mxCreateDoubleMatrix(1,1,mxREAL); pointer_to_tree = mxGetPr(plhs[2]); pointer_to_tree[0] = (long) tree; } if (!SkipQueries) { #ifdef TIME gettimeofday(&tv1,&tz); #endif #ifdef DEBUG mexPrintf("--------------------\n"); mexPrintf("Running Queries...\n"); #endif run_queries(tree->rootptr, model, M, tree->dims, closest_pts, distances, RETURN_POINTS); #ifdef DEBUG mexPrintf("Done Running Queries\n"); mexPrintf("--------------------\n"); #endif #ifdef TIME gettimeofday(&tv2,&tz); if (tv2.tv_usec - tv1.tv_usec < 0) { tv2.tv_sec--; tv2.tv_usec += 1000000; } mexPrintf("Time per Search : %f\n", (tv2.tv_sec - tv1.tv_sec + (tv2.tv_usec-tv1.tv_usec) /1000000.0 )/(double)M); #endif } if (nlhs<3) { #ifdef DEBUG mexPrintf("-------------------------------------\n"); mexPrintf("Removing k-D Tree from system memory.\n"); #endif free_tree(tree->rootptr); free(tree); #ifdef DEBUG mexPrintf("Done.\n"); mexPrintf("-------------------------------------\n"); #endif if (nlhs < 2){ free(distances); } } else{ #ifdef DEBUG mexPrintf("--------------------------------\n"); mexPrintf("k-D Tree saved in system memory.\n"); mexPrintf("Don't forget to remove it later.\n"); mexPrintf("--------------------------------\n"); #endif } #ifdef DEBUG mexPrintf("Mex function has exited normally.\n"); #endif }