32 void SingleExtremaFinder<T>::setDefault() {
37 void SingleExtremaFinder<T>::release() {
42 void SingleExtremaFinder<T>::check()
const {
43 if (this->getSettings().hw.size() > 1) {
44 std::cerr <<
"Search using multiple threads is not yet implemented. Single thread will be used.\n";
49 void SingleExtremaFinder<T>::initMax() {
54 void SingleExtremaFinder<T>::findMax(
const T *__restrict__ data) {
55 auto kernel = [&](
const T *
d) {
56 sFindMax(*m_cpu, this->getSettings().dims,
d,
57 this->getPositions().data(),
58 this->getValues().data());
60 return findBasic(data, kernel);
64 bool SingleExtremaFinder<T>::canBeReusedMax(
const ExtremaFinderSettings &s)
const {
69 void SingleExtremaFinder<T>::initLowest() {
74 void SingleExtremaFinder<T>::findLowest(
const T *__restrict__ data) {
75 auto kernel = [&](
const T *
d) {
76 sFindLowest(*m_cpu, this->getSettings().dims,
d,
77 this->getPositions().data(),
78 this->getValues().data());
80 return findBasic(data, kernel);
84 bool SingleExtremaFinder<T>::canBeReusedLowest(
const ExtremaFinderSettings &s)
const {
89 void SingleExtremaFinder<T>::initMaxAroundCenter() {
94 void SingleExtremaFinder<T>::findMaxAroundCenter(
const T *__restrict__ data) {
95 auto s = this->getSettings();
96 auto kernel2D = [&](
const T *
d) {
97 sFindMax2DAroundCenter(*m_cpu, s.dims,
d,
98 this->getPositions().data(),
99 this->getValues().data(),
100 s.maxDistFromCenter);
103 return findBasic(data, kernel2D);
109 bool SingleExtremaFinder<T>::canBeReusedMaxAroundCenter(
const ExtremaFinderSettings &s)
const {
114 void SingleExtremaFinder<T>::initLowestAroundCenter() {
119 void SingleExtremaFinder<T>::findLowestAroundCenter(
const T *__restrict__ data) {
120 auto s = this->getSettings();
121 auto kernel2D = [&](
const T *
d) {
122 sFindLowest2DAroundCenter(*m_cpu, s.dims,
d,
123 this->getPositions().data(),
124 this->getValues().data(),
125 s.maxDistFromCenter);
128 return findBasic(data, kernel2D);
134 bool SingleExtremaFinder<T>::canBeReusedLowestAroundCenter(
const ExtremaFinderSettings &s)
const {
140 void SingleExtremaFinder<T>::initBasic() {
142 auto s = this->getSettings();
143 if (0 == s.hw.size()) {
147 m_cpu =
dynamic_cast<CPU*
>(s.hw.at(0));
148 }
catch (std::bad_cast&) {
154 template<
typename KERNEL>
156 bool isReady = this->isInitialized();
166 const T *__restrict__ data,
167 float *__restrict__ positions,
168 T *__restrict__ values) {
171 assert(dims.
n() > 0);
172 assert(
nullptr != data);
173 assert((
nullptr != positions) || (
nullptr != values));
179 const T *__restrict__ data,
180 float *__restrict__ positions,
181 T *__restrict__ values) {
182 sFindUniversalChecks(dims, data, positions, values);
188 for (
size_t n = 0;
n < dims.
n(); ++
n) {
190 auto max = std::max_element(start, start + dims.
sizeSingle());
201 const T *__restrict__ data,
202 float *__restrict__ positions,
203 T *__restrict__ values) {
204 sFindUniversalChecks(dims, data, positions, values);
210 for (
size_t n = 0;
n < dims.
n(); ++
n) {
212 auto max = std::min_element(start, start + dims.
sizeSingle());
224 const T *__restrict__ data,
225 float *__restrict__ positions,
226 T *__restrict__ values,
228 sFindUniversal2DAroundCenter(std::greater<T>(),
229 std::numeric_limits<T>::lowest(),
230 cpu, dims, data, positions, values, maxDist);
237 const T *__restrict__ data,
238 float *__restrict__ positions,
239 T *__restrict__ values,
241 sFindUniversal2DAroundCenter(std::less<T>(),
243 cpu, dims, data, positions, values, maxDist);
261 assert(dims.
n() > 0);
262 assert(
nullptr != data);
263 assert((
nullptr != positions) || (
nullptr != values));
265 const size_t xHalf = dims.
x() / 2;
266 const size_t yHalf = dims.
y() / 2;
267 assert((2 * xHalf) > maxDist);
268 assert((2 * yHalf) > maxDist);
270 const auto min = std::pair<size_t, size_t>(
271 std::max((
size_t)0, xHalf - maxDist),
272 std::max((
size_t)0, yHalf - maxDist)
275 const auto max = std::pair<size_t, size_t>(
280 const size_t maxDistSq = maxDist * maxDist;
281 for (
size_t n = 0;
n < dims.
n(); ++
n) {
283 T extrema = startVal;
286 for (
size_t y =
min.second;
y <= max.second; ++
y) {
287 size_t offsetY =
y * dims.
x();
288 int logicY = (int)
y - yHalf;
289 size_t ySq = logicY * logicY;
290 for (
size_t x =
min.first;
x <= max.first; ++
x) {
291 int logicX = (int)
x - xHalf;
293 if ((ySq + (logicX * logicX)) > maxDistSq)
continue;
295 T tmp = data[offsetN + offsetY +
x];
296 if (comp(tmp, extrema)) {
303 if (
nullptr != positions) {
306 if (
nullptr != values) {
CUDA_HD constexpr bool is2D() const
constexpr size_t xyzPadded() const
void min(Image< double > &op1, const Image< double > &op2)
static void sFindLowest(const CPU &cpu, const Dimensions &dims, const T *data, float *positions, T *values)
Case or algorithm not implemented yet.
#define REPORT_ERROR(nerr, ErrormMsg)
constexpr bool isPadded() const
static void sFindUniversal2DAroundCenter(const C &comp, T startVal, const CPU &cpu, const Dimensions &dims, const T *data, float *positions, T *values, size_t maxDist)
static void sFindLowest2DAroundCenter(const CPU &cpu, const Dimensions &dims, const T *data, float *positions, T *values, size_t maxDist)
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
CUDA_HD constexpr size_t x() const
Incorrect argument received.
CUDA_HD constexpr size_t sizeSingle() const
void max(Image< double > &op1, const Image< double > &op2)
CUDA_HD constexpr size_t y() const
CUDA_HD constexpr size_t n() const
TYPE distance(struct Point_T *p, struct Point_T *q)
static void sFindMax(const CPU &cpu, const Dimensions &dims, const T *data, float *positions, T *values)
static void sFindMax2DAroundCenter(const CPU &cpu, const Dimensions &dims, const T *data, float *positions, T *values, size_t maxDist)
Some logical error in the pipeline.