void serial_initialize(pointVec_t &points) { points.reserve(cfg::numberOfPoints); unsigned int rseed=1; for(size_t i=0, count=0; long(i)<cfg::numberOfPoints; ++i) { points.push_back(util::GenerateRNDPoint<double>(count,&std::rand,RAND_MAX )); } }
point_t divide(const pointVec_t &P, pointVec_t &P_reduced, const point_t &p1, const point_t &p2) { SplitByCP splitByCP(p1, p2, P_reduced); point_t farPoint = std::for_each(P.begin(), P.end(), splitByCP); if(util::verbose) { std::stringstream ss; ss << P.size() << " nodes in bucket"<< ", " << "dividing by: [ " << p1 << ", " << p2 << " ], " << "farthest node: " << farPoint; util::OUTPUT.push_back(ss.str()); } return farPoint; }
point_t divide(const pointVec_t &P, pointVec_t &P_reduced, const point_t &p1, const point_t &p2) { SplitByCP_buf sbcpb(p1, p2, P, P_reduced); // Must use simple_partitioner (see the comment in initialize() above) tbb::parallel_reduce(range_t(0, P.size(), SplitByCP_buf::grainSize), sbcpb, tbb::simple_partitioner()); if(util::verbose) { std::stringstream ss; ss << P.size() << " nodes in bucket"<< ", " << "dividing by: [ " << p1 << ", " << p2 << " ], " << "farthest node: " << sbcpb.farthestPoint(); util::OUTPUT.push_back(ss.str()); } return sbcpb.farthestPoint(); }
void divide_and_conquer(const pointVec_t &P, pointVec_t &H, point_t p1, point_t p2) { assert(P.size() >= 2); pointVec_t P_reduced; pointVec_t H1, H2; point_t p_far = divide(P, P_reduced, p1, p2); if (P_reduced.size()<2) { H.push_back(p1); appendVector(P_reduced, H); } else { divide_and_conquer(P_reduced, H1, p1, p_far); divide_and_conquer(P_reduced, H2, p_far, p2); appendVector(H1, H); appendVector(H2, H); } }
void divide_and_conquer(const pointVec_t &P, pointVec_t &H, point_t p1, point_t p2, bool buffered) { assert(P.size() >= 2); pointVec_t P_reduced; pointVec_t H1, H2; point_t p_far; if(buffered) { p_far = divide<SplitByCP_buf>(P, P_reduced, p1, p2); } else { p_far = divide<SplitByCP>(P, P_reduced, p1, p2); } if (P_reduced.size()<2) { H.push_back(p1); #if USECONCVEC appendVector(P_reduced, H); #else // insert into STD::VECTOR H.insert(H.end(), P_reduced.begin(), P_reduced.end()); #endif } else { divide_and_conquer(P_reduced, H1, p1, p_far, buffered); divide_and_conquer(P_reduced, H2, p_far, p2, buffered); #if USECONCVEC appendVector(H1, H); appendVector(H2, H); #else // insert into STD::VECTOR H.insert(H.end(), H1.begin(), H1.end()); H.insert(H.end(), H2.begin(), H2.end()); #endif } }
void quickhull(const pointVec_t &points, pointVec_t &hull) { if (points.size() < 2) { appendVector(points, hull); return; } point_t p_maxx = extremum<FindXExtremum::maxX>(points); point_t p_minx = extremum<FindXExtremum::minX>(points); pointVec_t H; divide_and_conquer(points, hull, p_maxx, p_minx); divide_and_conquer(points, H, p_minx, p_maxx); appendVector(H, hull); }
void quickhull(const pointVec_t &points, pointVec_t &hull) { if (points.size() < 2) { hull.insert(hull.end(), points.begin(), points.end()); return; } point_t p_maxx = extremum<FindXExtremum::maxX>(points); point_t p_minx = extremum<FindXExtremum::minX>(points); pointVec_t H; divide_and_conquer(points, hull, p_maxx, p_minx); divide_and_conquer(points, H, p_minx, p_maxx); hull.insert(hull.end(), H.begin(), H.end()); }
void divide_and_conquer(const pointVec_t &P, pointVec_t &H, point_t p1, point_t p2) { assert(P.size() >= 2); pointVec_t P_reduced; pointVec_t H1, H2; point_t p_far = divide(P, P_reduced, p1, p2); if (P_reduced.size()<2) { H.push_back(p1); H.insert(H.end(), P_reduced.begin(), P_reduced.end()); } else { divide_and_conquer(P_reduced, H1, p1, p_far); divide_and_conquer(P_reduced, H2, p_far, p2); H.insert(H.end(), H1.begin(), H1.end()); H.insert(H.end(), H2.begin(), H2.end()); } }
void quickhull(const pointVec_t &points, pointVec_t &hull, bool buffered) { if (points.size() < 2) { #if USECONCVEC appendVector(points, hull); #else // STD::VECTOR hull.insert(hull.end(), points.begin(), points.end()); #endif // USECONCVEC return; } point_t p_maxx = extremum<FindXExtremum::maxX>(points); point_t p_minx = extremum<FindXExtremum::minX>(points); pointVec_t H; divide_and_conquer(points, hull, p_maxx, p_minx, buffered); divide_and_conquer(points, H, p_minx, p_maxx, buffered); #if USECONCVEC appendVector(H, hull); #else // STD::VECTOR hull.insert(hull.end(), H.begin(), H.end()); #endif // USECONCVEC }
void appendVector(const pointVec_t& src, pointVec_t& dest) { std::copy(src.begin(), src.end(), dest.grow_by(src.size())); }
void grow_vector_to_at_least(pointVec_t& vect, size_t size) { vect.grow_to_at_least(size); }
void appendVector(const point_t* src, size_t srcSize, pointVec_t& dest) { std::copy(src, src + srcSize, dest.grow_by(srcSize)); }
void appendVector(mutex_t& insertMutex, const pointVec_t& src, pointVec_t& dest) { mutex_t::scoped_lock lock(insertMutex); dest.insert(dest.end(), src.begin(), src.end()); }
void appendVector(mutex_t& insertMutex, const point_t* src, size_t srcSize, pointVec_t& dest) { mutex_t::scoped_lock lock(insertMutex); dest.insert(dest.end(), src, src + srcSize); }
point_t extremum(const pointVec_t &P) { FindXExtremum fxBody(P, type); tbb::parallel_reduce(range_t(0, P.size(), FindXExtremum::grainSize), fxBody); return fxBody.extremeXPoint(); }
point_t extremum(const pointVec_t &points) { assert(!points.empty()); return std::for_each(points.begin(), points.end(), FindXExtremum(points[0], type)); }
void grow_vector_to_at_least(mutex_t& mutex, pointVec_t& vect, size_t size) { mutex_t::scoped_lock lock(mutex); if (vect.size()< size){ vect.resize(size); } }