21 #ifndef DIFF_GRADIENT_MT_H
22 #define DIFF_GRADIENT_MT_H
26 #include <boost/thread.hpp>
27 #include <boost/ref.hpp>
35 template<
class Func,
class Model,
class Adapter>
40 const std::vector<double>& dx,
41 const Adapter& adapter,
49 Adapter aptr = adapter;
50 for(
size_t i = i_start;
i <= i_end;
i++)
52 double yi = adapter.get(&y,
i);
60 v[
i] = (fxp-fxm)/(2*dx[i]);
63 adapter.
set(&y, i, yi);
68 template<
class Func,
class Model,
class Adapter>
73 const std::vector<double>& dx,
74 const Adapter& adapter,
83 Adapter aptr = adapter;
85 for(
size_t i = i_start;
i <= i_end;
i++)
87 double yi = adapter.get(&y,
i);
91 v[
i] = (fxp - fx) / dx[i];
95 adapter.
set(&y, i, yi);
118 template<
class Func,
class Model,
class Adapter>
123 const std::vector<double>& dx,
124 const Adapter& adapter,
128 using namespace boost;
130 size_t D = adapter.size(&x);
133 size_t avail_core = thread::hardware_concurrency();
134 if(nt == 0 || nt > avail_core )
151 for(
size_t i = 0;
i < nt;
i++)
153 size_t l = (
i == nt - 1 ?
D : (
D/nt) * (
i+1));
154 thrds.create_thread(bind(
155 gradient_cfd_mt_worker<Func, Model, Adapter>,
156 boost::cref(f), boost::cref(x), boost::cref(dx), boost::cref(adapter),
157 (
D/nt) *
i, l - 1, boost::ref(G)));
176 template<
class Func,
class Vec>
182 const std::vector<double>& dx,
204 template<
class Func,
class Model,
class Adapter>
209 const std::vector<double>& dx,
210 const Adapter& adapter,
214 using namespace boost;
216 size_t D = adapter.size(&x);
220 size_t avail_core = thread::hardware_concurrency();
239 for(
size_t i = 0;
i < nt;
i++)
242 size_t l = (
i == nt - 1 ?
D : (
D/nt) * (
i+1));
244 thrds.create_thread(bind(
245 gradient_ffd_mt_worker<Func, Model, Adapter>,
246 boost::cref(f), boost::cref(x), boost::cref(dx), boost::cref(adapter),
247 fx, (
D/nt) *
i, l - 1, boost::ref(G)));
267 template<
class Func,
class Vec>
273 const std::vector<double>& dx,
285 template<
class Func,
class Model,
class Adapter>
290 const std::vector<double>& dx,
291 const Adapter& adapter,
299 Adapter aptr = adapter;
301 for(
size_t i = i_start;
i <= i_end;
i++)
303 double yi = adapter.get(&y,
i);
311 v[
i] = (fxp-fxm)/(2*dx[i]);
315 adapter.
set(&y, i, yi);
336 template<
class Func,
class Model,
class Adapter>
341 const std::vector<double>& dx,
342 const Adapter& adapter,
346 using namespace boost;
348 size_t D = adapter.size(&x);
351 size_t avail_core = thread::hardware_concurrency();
352 if(nt == 0 || nt > avail_core )
370 for(
size_t i = 0;
i < nt;
i++)
372 size_t l = (
i == nt - 1 ?
D : (
D/nt) * (
i+1));
374 thrds.create_thread(bind(
375 gradient_ind_cfd_mt_worker<Func, Model, Adapter>,
376 boost::cref(f), boost::cref(x), boost::cref(dx), boost::cref(adapter),
377 (
D/nt) *
i, l - 1, boost::ref(G)));
400 template<
class Func,
class Vec>
406 const std::vector<double>& dx,
void gradient_ind_cfd_mt_worker(const Func &f, const Model &x, const std::vector< double > &dx, const Adapter &adapter, size_t i_start, size_t i_end, Vector &v)
Helper function for gradient_ind_cfd_mt.
Definition: diff_gradient_mt.h:287
void gradient_ffd_mt_worker(const Func &f, const Model &x, const std::vector< double > &dx, const Adapter &adapter, double fx, size_t i_start, size_t i_end, Vector &v)
Helper function for gradient_ffd_mt.
Definition: diff_gradient_mt.h:70
void move_param(Model &x, size_t i, double dv, const Adapter &aptr)
Helper function that moves a parameter by an amount.
Definition: diff_util.h:102
void gradient_cfd_mt_worker(const Func &f, const Model &x, const std::vector< double > &dx, const Adapter &adapter, size_t i_start, size_t i_end, Vector &v)
Helper function for gradient_cfd_mt.
Definition: diff_gradient_mt.h:37
This class implements vectors, in the linear-algebra sense, with real-valued elements.
Definition: m_vector.h:87
x
Definition: APPgetLargeConnectedEdges.m:100
Vector & set(Value_type val)
Clone of zero_out(int)
Definition: m_vector.h:707
Vector gradient_cfd_mt(const Func &f, const Model &x, const std::vector< double > &dx, const Adapter &adapter, size_t nt)
Computes the gradient of a function, evaluated at a point, using central finite differences. Multi-threaded version.
Definition: diff_gradient_mt.h:120
Vector gradient_ind_cfd_mt(const Func &f, const Model &x, const std::vector< double > &dx, const Adapter &adapter, size_t nt)
Computes the gradient of a function, evaluated at a point, using central finite differences. Multithreaded version.
Definition: diff_gradient_mt.h:338
Default adapter for the hessian function.
Definition: diff_util.h:42
get the indices of edges in each direction for i
Definition: APPgetLargeConnectedEdges.m:48
Vector gradient_ffd_mt(const Func &f, const Model &x, const std::vector< double > &dx, const Adapter &adapter, size_t nt)
Computes the gradient of a function, evaluated at a point, using forward finite differences. Multi-threaded version.
Definition: diff_gradient_mt.h:206
D
Definition: APPgetLargeConnectedEdges.m:106
Definition for the Vector class, a thin wrapper on the KJB Vector struct and its related functionalit...