contrib/gel/pop/pop_manager.cxx

Go to the documentation of this file.
00001 // This is gel/pop/pop_manager.cxx
00002 #include "pop_manager.h"
00003 //:
00004 // \file
00005 #include <vnl/algo/vnl_levenberg_marquardt.h>
00006 #include <pop/pop_graph_cost_function.h>
00007 #include <vcl_iostream.h>
00008 
00009 
00010 //: constructor
00011 pop_manager::pop_manager()
00012 {
00013 }
00014 
00015 
00016 //: destructor
00017 pop_manager::~pop_manager()
00018 {
00019 }
00020 
00021 
00022 //: create a new parameter - only the manager should create new parameters
00023 pop_parameter* pop_manager::new_parameter()
00024 {
00025   pop_parameter *p = new pop_parameter();
00026   params_.push_back(p);
00027   return p;
00028 }
00029 
00030 //: create a vector of parameters
00031 vcl_vector<pop_parameter*> pop_manager::new_parameters(int num_param)
00032 {
00033   vcl_vector<pop_parameter*> params(num_param);
00034   for (int i=0;i<num_param;i++)
00035     params[i] = this->new_parameter();
00036   return params;
00037 }
00038 
00039 //: add a new parameter object
00040 void pop_manager::add_object(pop_object *obj)
00041 {
00042    objects_.push_back(obj);
00043 }
00044 
00045 
00046 //: update all the objects
00047 void pop_manager::update()
00048 {
00049   // call update on all known objects
00050   for (vcl_list<pop_object*>::iterator it=objects_.begin();it!=objects_.end();++it)
00051     (*it)->update();
00052 }
00053 
00054 
00055 //: get a vector of changeable parameters
00056 vcl_vector<pop_parameter*> pop_manager::get_changeable_parameters()
00057 {
00058   // first find all changeable parameters
00059   vcl_list<pop_parameter*> cp;
00060 
00061   for (vcl_list<pop_parameter*>::iterator it=params_.begin();it!=params_.end();++it) {
00062     if ((*it)->is_changeable_) {
00063       cp.push_back(*it);
00064     }
00065   }
00066   // now make a vector
00067   vcl_vector<pop_parameter*> v(cp.size());
00068   int i=0;
00069   for (vcl_list<pop_parameter*>::iterator it=cp.begin();it!=cp.end();++i,++it)
00070     v[i] = *it;
00071 
00072   return v;
00073 }
00074 
00075 
00076 //: optimize the parameters using Levenberg Marquardt
00077 void pop_manager::optimize(vcl_vector<pop_geometric_cost_function*> &obs_costs)
00078 {
00079   // step 1 make a cost function
00080   vcl_vector<pop_parameter*> cp = this->get_changeable_parameters();
00081   pop_graph_cost_function cf(cp,obs_costs,this);
00082 
00083   vcl_cout << "The initial costs are\n";
00084   vnl_vector<double> costs = cf.get_current_costs();
00085   vcl_cout << costs << vcl_endl;
00086 
00087   // step 2 make a lm optimizer
00088   vnl_levenberg_marquardt lm(cf);
00089 
00090   // lm.set_trace(true);
00091   // lm.set_verbose(true);
00092 
00093   // step 3 start the process
00094   vnl_vector<double> params = cf.get_parameter_values();
00095   bool flag = lm.minimize_without_gradient(params);
00096 
00097   vcl_cout << "The final costs are\n";
00098   costs = cf.get_current_costs();
00099   vcl_cout << costs << vcl_endl;
00100 
00101   if (!flag) {
00102     vcl_cout << "warning minimization routine did not converge\n";
00103   }
00104 }
00105 

Generated on Thu Aug 21 05:14:29 2008 for contrib/gel/pop by  doxygen 1.5.1