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()14 pop_manager::pop_manager()
15 {
16 }
17 
18 
19 //: destructor
~pop_manager()20 pop_manager::~pop_manager()
21 {
22 }
23 
24 
25 //: create a new parameter - only the manager should create new parameters
new_parameter()26 pop_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)34 std::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)43 void pop_manager::add_object(pop_object *obj)
44 {
45    objects_.push_back(obj);
46 }
47 
48 
49 //: update all the objects
update()50 void 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()59 std::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)80 void 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