Thanks Bruno for your prompt reply,

I got the important part of the code compiling, however since I am new to 
this lambda (functional) functions, I do not know how to pass the new 
definitions to SolverBFGS.

Looking at your suggestion I do the following:

class Shape_compute {    
    public:    
        Parameters par;
    
        Shape_compute (Parameters epar):par(epar) {
            Register([=]( Vector<double> ex, Vector<double> dx ){ return 
objective_fun (ex,dx); });
        }
    
    void Register(std::function<double(Vector<double>, Vector<double>)> 
Callback) {} //fun = objective_fun;
    
    double objective_fun ( Vector<double> ex, Vector<double> dx) {
        
        vector<double> x (par.design_N), grad (par.design_N);
        for (unsigned int i=0; i < x.size (); i++) {
                x [i] = ex(i);
            }
        Adaptive::DtN_Helmholtz<2> fem (par, x, true);
            fem.run ();
            double objective_function = fem.objective_function;
            
            for (unsigned int i=0; i < par.design_N; i++) {
                if (i < par.design_N) {
                    vector<double> aux = x; aux [i] += h;
                    Adaptive::DtN_Helmholtz<2> fem (par, aux, false);
                    fem.run (); 
                    grad [i] = (fem.objective_function - objective_function 
)/h;
                }
                dx(i) = grad [i];
            }
            iteration++;
            return objective_function;
        }
}; 


Then, when calling the optimization routine:
    
      Vector<double> X (N);
      
      SolverControl                residual_control (N, 1e-7);
      //SolverBFGS::AdditionalData   data (10, true);
      
      SolverBFGS<Vector<double> > opt (residual_control);//, data);
      
      Shape_compute  polar(par);
      opt.solve ( polar.Callback, X );     // If this line is commented, it 
compiles fine!


I would appreciate guidance on how to achieve this,

Thanks in advance,
  Juan Carlos Araújo




On Friday, 25 October 2019 17:55:03 UTC+2, Bruno Turcksin wrote:
>
> Juan,
>
> Take a look at 
> https://stackoverflow.com/questions/17131768/how-to-directly-bind-a-member-function-to-an-stdfunction-in-visual-studio-11
>  
> I advise using a lambda like the second reply suggests
>
> Best,
>
> Bruno
>
> On Friday, October 25, 2019 at 10:53:08 AM UTC-4, Juan Carlos Araujo 
> Cabarcas wrote:
>>
>> Dear all,
>>
>> I would like to use SolverBFGS from deal.II/optimization/ in my project, 
>> and I try to follow the documentation in
>>     https://www.dealii.org/current/doxygen/deal.II/classSolverBFGS.html
>>
>> First, I would like to mention that the documentation would really 
>> improve by adding a minimal example on how to use SolverBFGS.
>>
>> In my project, I cannot just define an independent function to be pass to 
>> SolverBFGS.
>> Instead, I define a class ShapePolar, which needs to be initialized with 
>> some mesh parameters par, as in
>>
>>     ShapePolar polar (par);
>>     
>> then I have implemented the function 
>>
>>     double ShapePolar::fun (const Vector<double>, Vector<double>)
>>
>> that computes a scalar value of an objective function and its gradient 
>> Vector, when we pass X.
>>
>>
>> Then, my attempt, after looking at the documentation, is to do something 
>> like this:
>>
>>   Vector<double> X (N);
>>       
>>   SolverControl                residual_control (N, 1e-7);
>>   //SolverBFGS::AdditionalData   data (10, true);
>>
>>   SolverBFGS<Vector<double> > opt (residual_control);   //, data);
>>
>>   ShapePolar  polar (par);
>>   std::function<double(const Vector<double>, Vector<double>)>  fun = 
>> polar.fun;
>>
>>   opt.solve ( fun, X );
>>
>> After several failed attempts (syntax errors), I realize that I am 
>> missing something fundamental here and could use some guidance.
>> I would appreciate any hint on how to achieve using SolverBFGS for the 
>> setting described above.
>>
>> Kind regards, 
>>     Juan C. Araújo Cabarcas
>>
>>

-- 
The deal.II project is located at http://www.dealii.org/
For mailing list/forum options, see 
https://groups.google.com/d/forum/dealii?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"deal.II User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to dealii+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/dealii/599f60b4-a71e-4d6f-9b4c-f89c48078dc4%40googlegroups.com.

Reply via email to