Guest User

Untitled

a guest
Jan 26th, 2015
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Класс оптимизируемой функции
  2.  
  3. public ref class LossFunction
  4. {
  5. private:
  6.     static double wrap(const std::vector<double> &x, std::vector<double> &grad, void *data)
  7.     {
  8.         gcroot<LossFunction^> *boxed_loss_func = (gcroot<LossFunction^> *) data;
  9.         LossFunction^ loss_func = *boxed_loss_func;
  10.         return loss_func(x);
  11.     }
  12.  
  13. public:
  14.     virtual double operator() (const std::vector<double> &x) = 0;
  15.  
  16.     double min(/* ... */)
  17.     {      
  18.         // ...
  19.  
  20.         gcroot<LossFunction^> *boxed_loss_func = new gcroot<LossFunction^>(this);
  21.         opt.set_min_objective((nlopt::vfunc) wrap, boxed_loss_func);
  22.  
  23.         // ...
  24.  
  25.         double min_func_value;
  26.         opt.optimize(x, min_func_value);
  27.  
  28.         // ...
  29.     }
  30. };
  31.  
  32. /*
  33.  
  34. boxed_loss_func
  35. 0x06B8FD80
  36.     handle: 0x057611A8
  37.     value: 0x02feb540
  38.  
  39. wrap
  40. 0x05C27670
  41.     double: *wrap+0 // method+offset
  42.  
  43. */
  44.  
  45. // nlopt.hpp, перед вызовом wrap
  46.  
  47. static double myvfunc(unsigned n, const double *x, double *grad, void *d_){
  48.     myfunc_data *d = reinterpret_cast<myfunc_data*>(d_);
  49.  
  50.     // ... 
  51.  
  52.     // тут вызов wrap, адрес функции верный
  53.     double val=d->vf(xv, grad ? d->o->gradtmp : d->o->gradtmp0, d->f_data);
  54.  
  55.     // ...
  56.  
  57.     return val;
  58. }
  59.  
  60. /*
  61.  
  62. d
  63. 0x06B8A5B0 { o=0x058CC714 mf=0x00000000 f=0x00000000 ...}
  64.     f: 0x00000000
  65.     f_data: 0x06B8FD80
  66.     mf: 0x00000000
  67.     munge_copy: 0x00000000
  68.     munge_destroy: 0x00000000
  69.     o: 0x058CC714 { o=0x058F7290 xtmp={...} gradtmp={...} ...}
  70.     vf: 0x05C27670
  71.  
  72. d->f_data
  73. 0x06B8FD80
  74.  
  75. data внутри метода wrap
  76. 0x058CC718
  77.  
  78. по сути это (d->o + 4)
  79.  
  80. .__.
  81.  
  82. */
Advertisement
Add Comment
Please, Sign In to add comment