Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Класс оптимизируемой функции
- public ref class LossFunction
- {
- private:
- static double wrap(const std::vector<double> &x, std::vector<double> &grad, void *data)
- {
- gcroot<LossFunction^> *boxed_loss_func = (gcroot<LossFunction^> *) data;
- LossFunction^ loss_func = *boxed_loss_func;
- return loss_func(x);
- }
- public:
- virtual double operator() (const std::vector<double> &x) = 0;
- double min(/* ... */)
- {
- // ...
- gcroot<LossFunction^> *boxed_loss_func = new gcroot<LossFunction^>(this);
- opt.set_min_objective((nlopt::vfunc) wrap, boxed_loss_func);
- // ...
- double min_func_value;
- opt.optimize(x, min_func_value);
- // ...
- }
- };
- /*
- boxed_loss_func
- 0x06B8FD80
- handle: 0x057611A8
- value: 0x02feb540
- wrap
- 0x05C27670
- double: *wrap+0 // method+offset
- */
- // nlopt.hpp, перед вызовом wrap
- static double myvfunc(unsigned n, const double *x, double *grad, void *d_){
- myfunc_data *d = reinterpret_cast<myfunc_data*>(d_);
- // ...
- // тут вызов wrap, адрес функции верный
- double val=d->vf(xv, grad ? d->o->gradtmp : d->o->gradtmp0, d->f_data);
- // ...
- return val;
- }
- /*
- d
- 0x06B8A5B0 { o=0x058CC714 mf=0x00000000 f=0x00000000 ...}
- f: 0x00000000
- f_data: 0x06B8FD80
- mf: 0x00000000
- munge_copy: 0x00000000
- munge_destroy: 0x00000000
- o: 0x058CC714 { o=0x058F7290 xtmp={...} gradtmp={...} ...}
- vf: 0x05C27670
- d->f_data
- 0x06B8FD80
- data внутри метода wrap
- 0x058CC718
- по сути это (d->o + 4)
- .__.
- */
Advertisement
Add Comment
Please, Sign In to add comment