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
1.5.1