1 // This is gel/pop/pop_manager.cxx 2 #include <iostream> 3 #include "pop_manager.h" 4 //: 5 // \file 6 #include <vnl/algo/vnl_levenberg_marquardt.h> 7 #include <pop/pop_graph_cost_function.h> 8 #ifdef _MSC_VER 9 # include "vcl_msvc_warnings.h" 10 #endif 11 12 13 //: constructor pop_manager()14pop_manager::pop_manager() 15 { 16 } 17 18 19 //: destructor ~pop_manager()20pop_manager::~pop_manager() 21 { 22 } 23 24 25 //: create a new parameter - only the manager should create new parameters new_parameter()26pop_parameter* pop_manager::new_parameter() 27 { 28 pop_parameter *p = new pop_parameter(); 29 params_.push_back(p); 30 return p; 31 } 32 33 //: create a vector of parameters new_parameters(int num_param)34std::vector<pop_parameter*> pop_manager::new_parameters(int num_param) 35 { 36 std::vector<pop_parameter*> params(num_param); 37 for (int i=0;i<num_param;i++) 38 params[i] = this->new_parameter(); 39 return params; 40 } 41 42 //: add a new parameter object add_object(pop_object * obj)43void pop_manager::add_object(pop_object *obj) 44 { 45 objects_.push_back(obj); 46 } 47 48 49 //: update all the objects update()50void pop_manager::update() 51 { 52 // call update on all known objects 53 for (std::list<pop_object*>::iterator it=objects_.begin();it!=objects_.end();++it) 54 (*it)->update(); 55 } 56 57 58 //: get a vector of changeable parameters get_changeable_parameters()59std::vector<pop_parameter*> pop_manager::get_changeable_parameters() 60 { 61 // first find all changeable parameters 62 std::list<pop_parameter*> cp; 63 64 for (std::list<pop_parameter*>::iterator it=params_.begin();it!=params_.end();++it) { 65 if ((*it)->is_changeable_) { 66 cp.push_back(*it); 67 } 68 } 69 // now make a vector 70 std::vector<pop_parameter*> v(cp.size()); 71 int i=0; 72 for (std::list<pop_parameter*>::iterator it=cp.begin();it!=cp.end();++i,++it) 73 v[i] = *it; 74 75 return v; 76 } 77 78 79 //: optimize the parameters using Levenberg Marquardt optimize(std::vector<pop_geometric_cost_function * > & obs_costs)80void pop_manager::optimize(std::vector<pop_geometric_cost_function*> &obs_costs) 81 { 82 // step 1 make a cost function 83 std::vector<pop_parameter*> cp = this->get_changeable_parameters(); 84 pop_graph_cost_function cf(cp,obs_costs,this); 85 86 std::cout << "The initial costs are\n"; 87 vnl_vector<double> costs = cf.get_current_costs(); 88 std::cout << costs << std::endl; 89 90 // step 2 make a lm optimizer 91 vnl_levenberg_marquardt lm(cf); 92 93 // lm.set_trace(true); 94 // lm.set_verbose(true); 95 96 // step 3 start the process 97 vnl_vector<double> params = cf.get_parameter_values(); 98 bool flag = lm.minimize_without_gradient(params); 99 100 std::cout << "The final costs are\n"; 101 costs = cf.get_current_costs(); 102 std::cout << costs << std::endl; 103 104 if (!flag) { 105 std::cout << "warning minimization routine did not converge\n"; 106 } 107 } 108