vSMC
vSMC: Scalable Monte Carlo
adapter.hpp
Go to the documentation of this file.
1 //============================================================================
2 // vSMC/include/vsmc/core/adapter.hpp
3 //----------------------------------------------------------------------------
4 // vSMC: Scalable Monte Carlo
5 //----------------------------------------------------------------------------
6 // Copyright (c) 2013,2014, Yan Zhou
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // Redistributions of source code must retain the above copyright notice,
13 // this list of conditions and the following disclaimer.
14 //
15 // Redistributions in binary form must reproduce the above copyright notice,
16 // this list of conditions and the following disclaimer in the documentation
17 // and/or other materials provided with the distribution.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS
20 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 // POSSIBILITY OF SUCH DAMAGE.
30 //============================================================================
31 
32 #ifndef VSMC_CORE_ADAPTER_HPP
33 #define VSMC_CORE_ADAPTER_HPP
34 
35 #include <vsmc/internal/common.hpp>
36 
37 namespace vsmc {
38 
39 template <typename, template <typename, typename> class,
40  typename = NullType> class InitializeAdapter;
41 template <typename, template <typename, typename> class,
42  typename = NullType> class MoveAdapter;
43 template <typename, template <typename, typename> class,
44  typename = NullType> class MonitorEvalAdapter;
45 template <typename, template <typename, typename> class,
46  typename = NullType> class PathEvalAdapter;
47 
50 template <typename T, typename F, typename BaseType>
52 {
53  public :
54 
56 
57  InitializeAdapterBase (const F &f) : f_(f) {}
58 
59  void initialize_param (Particle<T> &particle, void *param)
60  {
61  initialize_param_dispatch(particle, param,
62  typename has_initialize_param_<F>::type());
63  }
64 
65  void pre_processor (Particle<T> &particle)
66  {
67  pre_processor_dispatch(particle,
68  typename has_pre_processor_<F>::type());
69  }
70 
71  void post_processor (Particle<T> &particle)
72  {
73  post_processor_dispatch(particle,
74  typename has_post_processor_<F>::type());
75  }
76 
77  F &implementation () {return f_;}
78 
79  const F &implementation () const {return f_;}
80 
81  private :
82 
83  F f_;
84 
86  void, (Particle<T> &, void *))
88  void, (Particle<T> &))
90  void, (Particle<T> &))
91 
92  void initialize_param_dispatch (Particle<T> &particle, void *param,
93  cxx11::true_type)
94  {f_.initialize_param(particle, param);}
95 
96  void pre_processor_dispatch (Particle<T> &particle, cxx11::true_type)
97  {f_.pre_processor(particle);}
98 
99  void post_processor_dispatch (Particle<T> &particle, cxx11::true_type)
100  {f_.post_processor(particle);}
101 
102  void initialize_param_dispatch
103  (Particle<T> &, void *, cxx11::false_type) {}
104  void pre_processor_dispatch
105  (Particle<T> &, cxx11::false_type) {}
106  void post_processor_dispatch
107  (Particle<T> &, cxx11::false_type) {}
108 }; // InitializeAdapterBase
109 
112 template <typename T, typename F, typename BaseType>
113 class MoveAdapterBase : public BaseType
114 {
115  public :
116 
118 
119  MoveAdapterBase (const F &f) : f_(f) {}
120 
121  void pre_processor (std::size_t iter, Particle<T> &particle)
122  {
123  pre_processor_dispatch(iter, particle,
124  typename has_pre_processor_<F>::type());
125  }
126 
127  void post_processor (std::size_t iter, Particle<T> &particle)
128  {
129  post_processor_dispatch(iter, particle,
130  typename has_post_processor_<F>::type());
131  }
132 
133  F &implementation () {return f_;}
134 
135  const F &implementation () const {return f_;}
136 
137  private :
138 
139  F f_;
140 
141  VSMC_DEFINE_METHOD_CHECKER(pre_processor,
142  void, (std::size_t, Particle<T> &))
143  VSMC_DEFINE_METHOD_CHECKER(post_processor,
144  void, (std::size_t, Particle<T> &))
145 
146  void pre_processor_dispatch (std::size_t iter, Particle<T> &particle,
147  cxx11::true_type)
148  {f_.pre_processor(iter, particle);}
149 
150  void post_processor_dispatch (std::size_t iter, Particle<T> &particle,
152  {f_.post_processor(iter, particle);}
153 
154  void pre_processor_dispatch
155  (std::size_t, Particle<T> &, cxx11::false_type) {}
156  void post_processor_dispatch
157  (std::size_t, Particle<T> &, cxx11::false_type) {}
158 }; // MoveAdapterBase
159 
162 template <typename T, typename F, typename BaseType>
164 {
165  public :
166 
168 
169  MonitorEvalAdapterBase (const F &f) : f_(f) {}
170 
171  void pre_processor (std::size_t iter, const Particle<T> &particle)
172  {
173  pre_processor_dispatch(iter, particle,
174  typename has_pre_processor_<F>::type());
175  }
176 
177  void post_processor (std::size_t iter, const Particle<T> &particle)
178  {
179  post_processor_dispatch(iter, particle,
180  typename has_post_processor_<F>::type());
181  }
182 
183  F &implementation () {return f_;}
184 
185  const F &implementation () const {return f_;}
186 
187  private :
188 
189  F f_;
190 
191  VSMC_DEFINE_METHOD_CHECKER(pre_processor,
192  void, (std::size_t, const Particle<T> &))
193  VSMC_DEFINE_METHOD_CHECKER(post_processor,
194  void, (std::size_t, const Particle<T> &))
195 
196  void pre_processor_dispatch (std::size_t iter,
197  const Particle<T> &particle, cxx11::true_type)
198  {f_.pre_processor(iter, particle);}
199 
200  void post_processor_dispatch (std::size_t iter,
201  const Particle<T> &particle, cxx11::true_type)
202  {f_.post_processor(iter, particle);}
203 
204  void pre_processor_dispatch
205  (std::size_t, const Particle<T> &, cxx11::false_type) {}
206  void post_processor_dispatch
207  (std::size_t, const Particle<T> &, cxx11::false_type) {}
208 }; // MonitorEvalAdapterBase
209 
212 template <typename T, typename F, typename BaseType>
214 {
215  public :
216 
218 
219  PathEvalAdapterBase (const F &f) : f_(f) {}
220 
221  double path_grid (std::size_t iter, const Particle<T> &particle)
222  {return f_.path_grid(iter, particle);}
223 
224  void pre_processor (std::size_t iter, const Particle<T> &particle)
225  {
226  pre_processor_dispatch(iter, particle,
227  typename has_pre_processor_<F>::type());
228  }
229 
230  void post_processor (std::size_t iter, const Particle<T> &particle)
231  {
232  post_processor_dispatch(iter, particle,
233  typename has_post_processor_<F>::type());
234  }
235 
236  F &implementation () {return f_;}
237 
238  const F &implementation () const {return f_;}
239 
240  private :
241 
242  F f_;
243 
244  VSMC_DEFINE_METHOD_CHECKER(pre_processor,
245  void, (std::size_t, const Particle<T> &))
246  VSMC_DEFINE_METHOD_CHECKER(post_processor,
247  void, (std::size_t, const Particle<T> &))
248 
249  void pre_processor_dispatch (std::size_t iter,
250  const Particle<T> &particle, cxx11::true_type)
251  {f_.pre_processor(iter, particle);}
252 
253  void post_processor_dispatch (std::size_t iter,
254  const Particle<T> &particle, cxx11::true_type)
255  {f_.post_processor(iter, particle);}
256 
257  void pre_processor_dispatch
258  (std::size_t, const Particle<T> &, cxx11::false_type) {}
259  void post_processor_dispatch
260  (std::size_t, const Particle<T> &, cxx11::false_type) {}
261 }; // PathEvalAdapterBase
262 
265 template <typename T, typename BaseType>
267 {
268  public :
269 
270  typedef cxx11::function<void (Particle<T> &, void *)>
272  typedef cxx11::function<void (Particle<T> &)>
274  typedef cxx11::function<void (Particle<T> &)>
276 
278  const initialize_param_type &init_param = initialize_param_type(),
279  const pre_processor_type &pre = pre_processor_type(),
280  const post_processor_type &post = post_processor_type()) :
281  initialize_param_(init_param),
282  pre_processor_(pre), post_processor_(post) {}
283 
284  void initialize_param (Particle<T> &particle, void *param)
285  {
286  if (static_cast<bool>(initialize_param_))
287  initialize_param_(particle, param);
288  }
289 
290  void pre_processor (Particle<T> &particle)
291  {if (static_cast<bool>(pre_processor_)) pre_processor_(particle);}
292 
293  void post_processor (Particle<T> &particle)
294  {if (static_cast<bool>(post_processor_)) post_processor_(particle);}
295 
296  private :
297 
298  const initialize_param_type initialize_param_;
299  const pre_processor_type pre_processor_;
300  const post_processor_type post_processor_;
301 }; // class InitializeAdapterBase
302 
305 template <typename T, typename BaseType>
307 {
308  public :
309 
310  typedef cxx11::function<void (std::size_t, Particle<T> &)>
312  typedef cxx11::function<void (std::size_t, Particle<T> &)>
314 
316  const pre_processor_type &pre = pre_processor_type(),
317  const post_processor_type &post = post_processor_type()) :
318  pre_processor_(pre), post_processor_(post) {}
319 
320  void pre_processor (std::size_t iter, Particle<T> &particle)
321  {if (static_cast<bool>(pre_processor_)) pre_processor_(iter, particle);}
322 
323  void post_processor (std::size_t iter, Particle<T> &particle)
324  {if (static_cast<bool>(post_processor_)) post_processor_(iter, particle);}
325 
326  private :
327 
328  const pre_processor_type pre_processor_;
329  const post_processor_type post_processor_;
330 }; // class MoveAdapterBase
331 
334 template <typename T, typename BaseType>
336 {
337  public :
338 
339  typedef cxx11::function<void (std::size_t, const Particle<T> &)>
341  typedef cxx11::function<void (std::size_t, const Particle<T> &)>
343 
345  const pre_processor_type &pre = pre_processor_type(),
346  const post_processor_type &post = post_processor_type()) :
347  pre_processor_(pre), post_processor_(post) {}
348 
349  void pre_processor (std::size_t iter, const Particle<T> &particle)
350  {if (static_cast<bool>(pre_processor_)) pre_processor_(iter, particle);}
351 
352  void post_processor (std::size_t iter, const Particle<T> &particle)
353  {if (static_cast<bool>(post_processor_)) post_processor_(iter, particle);}
354 
355  private :
356 
357  const pre_processor_type pre_processor_;
358  const post_processor_type post_processor_;
359 }; // class MonitorEvalAdapterBase
360 
363 template <typename T, typename BaseType>
365 {
366  public :
367 
368  typedef cxx11::function<double (std::size_t, const Particle<T> &)>
370  typedef cxx11::function<void (std::size_t, const Particle<T> &)>
372  typedef cxx11::function<void (std::size_t, const Particle<T> &)>
374 
376  const path_grid_type &path_grid,
377  const pre_processor_type &pre = pre_processor_type(),
378  const post_processor_type &post = post_processor_type()) :
379  path_grid_(path_grid), pre_processor_(pre), post_processor_(post) {}
380 
381  double path_grid (std::size_t iter, const Particle<T> &particle)
382  {return path_grid_(iter, particle);}
383 
384  void pre_processor (std::size_t iter, const Particle<T> &particle)
385  {if (static_cast<bool>(pre_processor_)) pre_processor_(iter, particle);}
386 
387  void post_processor (std::size_t iter, const Particle<T> &particle)
388  {if (static_cast<bool>(post_processor_)) post_processor_(iter, particle);}
389 
390  private :
391 
392  const path_grid_type path_grid_;
393  const pre_processor_type pre_processor_;
394  const post_processor_type post_processor_;
395 }; // class PathEvalAdapterBase
396 
397 } // namespace vsmc
398 
399 #endif // VSMC_CORE_ADAPTER_HPP
void pre_processor(Particle< T > &particle)
Definition: adapter.hpp:65
Definition: adapter.hpp:37
Particle class representing the whole particle set.
Definition: particle.hpp:48
cxx11::function< void(std::size_t, const Particle< T > &)> pre_processor_type
Definition: adapter.hpp:371
const F & implementation() const
Definition: adapter.hpp:185
cxx11::function< void(Particle< T > &, void *)> initialize_param_type
Definition: adapter.hpp:271
void pre_processor(std::size_t iter, Particle< T > &particle)
Definition: adapter.hpp:320
cxx11::function< void(Particle< T > &)> pre_processor_type
Definition: adapter.hpp:273
cxx11::function< void(std::size_t, Particle< T > &)> pre_processor_type
Definition: adapter.hpp:311
PathEvalAdapterBase(const path_grid_type &path_grid, const pre_processor_type &pre=pre_processor_type(), const post_processor_type &post=post_processor_type())
Definition: adapter.hpp:375
STL namespace.
const F & implementation() const
Definition: adapter.hpp:135
void pre_processor(std::size_t iter, Particle< T > &particle)
Definition: adapter.hpp:121
#define VSMC_DEFINE_METHOD_CHECKER(name, RT, Args)
Definition: traits.hpp:118
void post_processor(std::size_t iter, const Particle< T > &particle)
Definition: adapter.hpp:387
void pre_processor(Particle< T > &particle)
Definition: adapter.hpp:290
Monitor evaluation base.
Definition: adapter.hpp:163
cxx11::function< double(std::size_t, const Particle< T > &)> path_grid_type
Definition: adapter.hpp:369
Path evaluation class base.
Definition: adapter.hpp:213
Initialize class adapter base.
Definition: adapter.hpp:51
Path evaluation class adapter.
Definition: adapter.hpp:46
cxx11::function< void(std::size_t, const Particle< T > &)> post_processor_type
Definition: adapter.hpp:373
MoveAdapterBase(const pre_processor_type &pre=pre_processor_type(), const post_processor_type &post=post_processor_type())
Definition: adapter.hpp:315
MonitorEvalAdapterBase(const F &f)
Definition: adapter.hpp:169
void post_processor(Particle< T > &particle)
Definition: adapter.hpp:293
integral_constant< bool, false > false_type
cxx11::function< void(std::size_t, Particle< T > &)> post_processor_type
Definition: adapter.hpp:313
void post_processor(std::size_t iter, Particle< T > &particle)
Definition: adapter.hpp:127
PathEvalAdapterBase(const F &f)
Definition: adapter.hpp:219
cxx11::function< void(Particle< T > &)> post_processor_type
Definition: adapter.hpp:275
void pre_processor(std::size_t iter, const Particle< T > &particle)
Definition: adapter.hpp:224
void pre_processor(std::size_t iter, const Particle< T > &particle)
Definition: adapter.hpp:349
MoveAdapterBase(const F &f)
Definition: adapter.hpp:119
double path_grid(std::size_t iter, const Particle< T > &particle)
Definition: adapter.hpp:221
void pre_processor(std::size_t iter, const Particle< T > &particle)
Definition: adapter.hpp:171
const F & implementation() const
Definition: adapter.hpp:238
cxx11::function< void(std::size_t, const Particle< T > &)> post_processor_type
Definition: adapter.hpp:342
const F & implementation() const
Definition: adapter.hpp:79
void post_processor(std::size_t iter, Particle< T > &particle)
Definition: adapter.hpp:323
void post_processor(std::size_t iter, const Particle< T > &particle)
Definition: adapter.hpp:230
Move class adapter base.
Definition: adapter.hpp:113
integral_constant< bool, true > true_type
double path_grid(std::size_t iter, const Particle< T > &particle)
Definition: adapter.hpp:381
void initialize_param(Particle< T > &particle, void *param)
Definition: adapter.hpp:59
void pre_processor(std::size_t iter, const Particle< T > &particle)
Definition: adapter.hpp:384
cxx11::function< void(std::size_t, const Particle< T > &)> pre_processor_type
Definition: adapter.hpp:340
void post_processor(std::size_t iter, const Particle< T > &particle)
Definition: adapter.hpp:352
void post_processor(Particle< T > &particle)
Definition: adapter.hpp:71
Move class adapter.
Definition: adapter.hpp:42
MonitorEvalAdapterBase(const pre_processor_type &pre=pre_processor_type(), const post_processor_type &post=post_processor_type())
Definition: adapter.hpp:344
void initialize_param(Particle< T > &particle, void *param)
Definition: adapter.hpp:284
Monitor evaluation class adapter.
Definition: adapter.hpp:44
void post_processor(std::size_t iter, const Particle< T > &particle)
Definition: adapter.hpp:177
InitializeAdapterBase(const F &f)
Definition: adapter.hpp:57
Initialize class adapter.
Definition: adapter.hpp:40
InitializeAdapterBase(const initialize_param_type &init_param=initialize_param_type(), const pre_processor_type &pre=pre_processor_type(), const post_processor_type &post=post_processor_type())
Definition: adapter.hpp:277