32 #ifndef MCKL_SMP_BACKEND_BASE_HPP 33 #define MCKL_SMP_BACKEND_BASE_HPP 40 #ifndef MCKL_SMP_BACKEND 44 #define MCKL_SMP_BACKEND ::mckl::BackendTBB 46 #define MCKL_SMP_BACKEND ::mckl::BackendOMP 48 #define MCKL_SMP_BACKEND ::mckl::BackendSTD 52 #define MCKL_DEFINE_SMP_BACKEND_BASE_SPECIAL(Name) \ 53 Name##Base() = default; \ 54 Name##Base(const Name##Base<T, Derived> &) = default; \ 55 Name##Base<T, Derived> &operator=(const Name##Base<T, Derived> &) = \ 57 Name##Base(Name##Base<T, Derived> &&) = default; \ 58 Name##Base<T, Derived> &operator=(Name##Base<T, Derived> &&) = default; 60 #define MCKL_DEFINE_SMP_BACKEND_BASE_SPECIAL_VIRTUAL(Name) \ 61 Name##Base() = default; \ 62 Name##Base(const Name##Base<T, Virtual> &) = default; \ 63 Name##Base<T, Virtual> &operator=(const Name##Base<T, Virtual> &) = \ 65 Name##Base(Name##Base<T, Virtual> &&) = default; \ 66 Name##Base<T, Virtual> &operator=(Name##Base<T, Virtual> &&) = default; \ 67 virtual ~Name##Base() = default; 69 #define MCKL_DEFINE_SMP_BACKEND_SPECIAL(Impl, Name) \ 70 Name##SMP() = default; \ 71 Name##SMP(const Name##SMP<T, Derived, Backend##Impl> &) = default; \ 72 Name##SMP<T, Derived, Backend##Impl> &operator=( \ 73 const Name##SMP<T, Derived, Backend##Impl> &) = default; \ 74 Name##SMP(Name##SMP<T, Derived, Backend##Impl> &&) = default; \ 75 Name##SMP<T, Derived, Backend##Impl> &operator=( \ 76 Name##SMP<T, Derived, Backend##Impl> &&) = default; 102 template <
typename T,
typename = Virtual,
typename = BackendSMP>
107 template <
typename T,
typename = Virtual,
typename = BackendSMP>
112 template <
typename T,
typename Derived>
120 eval_dispatch(iter, idx, &Derived::eval_each);
125 eval_range_dispatch(iter, range, &Derived::eval_range);
130 eval_first_dispatch(iter, particle, &Derived::eval_first);
135 eval_last_dispatch(iter, particle, &Derived::eval_last);
141 template <
typename D>
145 static_cast<Derived *
>(
this)->
eval_each(iter, idx);
148 template <
typename D>
152 static_cast<Derived *
>(
this)->
eval_range(iter, range);
155 template <
typename D>
156 void eval_first_dispatch(std::size_t iter,
Particle<T> &particle,
159 static_cast<Derived *
>(
this)->
eval_first(iter, particle);
162 template <
typename D>
163 void eval_last_dispatch(std::size_t iter,
Particle<T> &particle,
166 static_cast<Derived *
>(
this)->
eval_last(iter, particle);
171 template <
typename D>
175 static_cast<Derived *
>(
this)->
eval_each(iter, idx);
178 template <
typename D>
182 static_cast<Derived *
>(
this)->
eval_range(iter, range);
185 template <
typename D>
186 void eval_first_dispatch(std::size_t iter,
Particle<T> &particle,
189 static_cast<Derived *
>(
this)->
eval_first(iter, particle);
192 template <
typename D>
193 void eval_last_dispatch(std::size_t iter,
Particle<T> &particle,
196 static_cast<Derived *
>(
this)->
eval_last(iter, particle);
204 Derived::eval_each(iter, idx);
210 Derived::eval_range(iter, range);
213 void eval_first_dispatch(std::size_t iter,
Particle<T> &particle,
216 Derived::eval_first(iter, particle);
219 void eval_last_dispatch(std::size_t iter,
Particle<T> &particle,
222 Derived::eval_last(iter, particle);
235 for (
auto idx : range) {
240 void eval_first_dispatch(std::size_t,
Particle<T> &,
245 void eval_last_dispatch(std::size_t,
Particle<T> &,
253 template <
typename T>
263 for (
auto idx : range) {
275 template <
typename T,
typename Derived>
284 eval_dispatch(iter, dim, idx, r, &Derived::eval_each);
290 eval_range_dispatch(iter, dim, range, r, &Derived::eval_range);
295 eval_first_dispatch(iter, particle, &Derived::eval_first);
300 eval_last_dispatch(iter, particle, &Derived::eval_last);
306 template <
typename D>
311 static_cast<Derived *
>(
this)->
eval_each(iter, dim, idx, r);
314 template <
typename D>
315 void eval_range_dispatch(std::size_t iter, std::size_t dim,
320 static_cast<Derived *
>(
this)->
eval_range(iter, dim, range, r);
323 template <
typename D>
324 void eval_first_dispatch(std::size_t iter,
Particle<T> &particle,
327 static_cast<Derived *
>(
this)->
eval_first(iter, particle);
330 template <
typename D>
331 void eval_last_dispatch(std::size_t iter,
Particle<T> &particle,
334 static_cast<Derived *
>(
this)->
eval_last(iter, particle);
339 template <
typename D>
345 static_cast<Derived *
>(
this)->
eval_each(iter, dim, idx, r);
348 template <
typename D>
349 void eval_range_dispatch(std::size_t iter, std::size_t dim,
354 static_cast<Derived *
>(
this)->
eval_range(iter, dim, range, r);
357 template <
typename D>
358 void eval_first_dispatch(std::size_t iter,
Particle<T> &particle,
361 static_cast<Derived *
>(
this)->
eval_first(iter, particle);
364 template <
typename D>
365 void eval_last_dispatch(std::size_t iter,
Particle<T> &particle,
368 static_cast<Derived *
>(
this)->
eval_last(iter, particle);
377 Derived::eval_each(iter, dim, idx, r);
380 void eval_range_dispatch(std::size_t iter, std::size_t dim,
384 Derived::eval_range(iter, dim, range, r);
387 void eval_first_dispatch(std::size_t iter,
Particle<T> &particle,
390 Derived::eval_first(iter, particle);
393 void eval_last_dispatch(std::size_t iter,
Particle<T> &particle,
396 Derived::eval_last(iter, particle);
407 void eval_range_dispatch(std::size_t iter, std::size_t dim,
412 for (
auto idx : range) {
418 void eval_first_dispatch(std::size_t,
Particle<T> &,
423 void eval_last_dispatch(std::size_t,
Particle<T> &,
431 template <
typename T>
445 for (
auto idx : range) {
460 #endif // MCKL_SMP_BACKEND_BASE_HPP virtual void eval_range(std::size_t iter, const ParticleRange< T > &range)
SMCSampler evaluation base dispatch class.
void eval_range(std::size_t iter, std::size_t dim, const ParticleRange< T > &range, double *r)
virtual void eval_last(std::size_t, Particle< T > &)
#define MCKL_PUSH_CLANG_WARNING(warning)
#define MCKL_DEFINE_SMP_BACKEND_BASE_SPECIAL_VIRTUAL(Name)
virtual void eval_first(std::size_t, Particle< T > &)
virtual void eval_last(std::size_t, Particle< T > &)
SMCSMCSampler<T>::eval_type.
void eval_first(std::size_t iter, Particle< T > &particle)
#define MCKL_SMP_BACKEND
Default SMP backend.
virtual void eval_first(std::size_t, Particle< T > &)
void eval_last(std::size_t iter, Particle< T > &particle)
void eval_each(std::size_t iter, ParticleIndex< T > idx)
::mckl::BackendTBB BackendSMP
SMP default implementation ID.
#define MCKL_DEFINE_SMP_BACKEND_BASE_SPECIAL(Name)
SMCEstimator<T>::eval_type.
#define MCKL_POP_CLANG_WARNING
SMCEstimator evalution base dispatch class.
A thin wrapper over a complete Particle.
void eval_last(std::size_t iter, Particle< T > &particle)
virtual void eval_range(std::size_t iter, std::size_t dim, const ParticleRange< T > &range, double *r)
void eval_first(std::size_t iter, Particle< T > &particle)
void eval_range(std::size_t iter, const ParticleRange< T > &range)