00001 #include "mfpf_sad_vec_cost.h" 00002 //: 00003 // \file 00004 // \brief Computes weighted sum of absolute differences to a mean 00005 // \author Tim Cootes 00006 00007 #include <vsl/vsl_binary_loader.h> 00008 #include <vcl_cmath.h> 00009 #include <vcl_cassert.h> 00010 #include <vcl_cstdlib.h> 00011 00012 #include <vnl/io/vnl_io_vector.h> 00013 00014 //======================================================================= 00015 // Dflt ctor 00016 //======================================================================= 00017 00018 mfpf_sad_vec_cost::mfpf_sad_vec_cost() 00019 { 00020 } 00021 00022 //======================================================================= 00023 // Destructor 00024 //======================================================================= 00025 00026 mfpf_sad_vec_cost::~mfpf_sad_vec_cost() 00027 { 00028 } 00029 00030 //: Define mean and weights 00031 void mfpf_sad_vec_cost::set(const vnl_vector<double>& mean, 00032 const vnl_vector<double>& wts) 00033 { 00034 assert(mean.size()==wts.size()); 00035 mean_=mean; 00036 wts_ =wts; 00037 if (wts.mean()>9999) 00038 { 00039 vcl_cerr<<"Mean weights excessive: "<<wts.mean()<<vcl_endl; 00040 vcl_abort(); 00041 } 00042 } 00043 00044 //: Evaluate weighted sum of absolute difference from mean 00045 double mfpf_sad_vec_cost::evaluate(const vnl_vector<double>& v) 00046 { 00047 double sum=0; 00048 for (unsigned i=0;i<v.size();++i) 00049 { 00050 sum += wts_[i]*vcl_fabs(v[i]-mean_[i]); 00051 } 00052 return sum; 00053 } 00054 00055 //: Return the mean 00056 void mfpf_sad_vec_cost::get_average(vnl_vector<double>& v) const 00057 { 00058 v=mean_; 00059 } 00060 00061 //======================================================================= 00062 // Method: version_no 00063 //======================================================================= 00064 00065 short mfpf_sad_vec_cost::version_no() const 00066 { 00067 return 1; 00068 } 00069 00070 //======================================================================= 00071 // Method: is_a 00072 //======================================================================= 00073 00074 vcl_string mfpf_sad_vec_cost::is_a() const 00075 { 00076 return vcl_string("mfpf_sad_vec_cost"); 00077 } 00078 00079 //: Create a copy on the heap and return base class pointer 00080 mfpf_vec_cost* mfpf_sad_vec_cost::clone() const 00081 { 00082 return new mfpf_sad_vec_cost(*this); 00083 } 00084 00085 //======================================================================= 00086 // Method: print 00087 //======================================================================= 00088 00089 void mfpf_sad_vec_cost::print_summary(vcl_ostream& os) const 00090 { 00091 os<<"Size: "<<mean_.size() 00092 <<" mean.sum():"<<mean_.sum() 00093 <<" wts.sum():"<<wts_.sum(); 00094 } 00095 00096 //======================================================================= 00097 // Method: save 00098 //======================================================================= 00099 00100 void mfpf_sad_vec_cost::b_write(vsl_b_ostream& bfs) const 00101 { 00102 vsl_b_write(bfs,version_no()); 00103 vsl_b_write(bfs,mean_); 00104 vsl_b_write(bfs,wts_); 00105 } 00106 00107 //======================================================================= 00108 // Method: load 00109 //======================================================================= 00110 00111 void mfpf_sad_vec_cost::b_read(vsl_b_istream& bfs) 00112 { 00113 if (!bfs) return; 00114 short version; 00115 vsl_b_read(bfs,version); 00116 switch (version) 00117 { 00118 case (1): 00119 vsl_b_read(bfs,mean_); 00120 vsl_b_read(bfs,wts_); 00121 break; 00122 default: 00123 vcl_cerr << "I/O ERROR: vsl_b_read(vsl_b_istream&)\n" 00124 << " Unknown version number "<< version << vcl_endl; 00125 bfs.is().clear(vcl_ios::badbit); // Set an unrecoverable IO error on stream 00126 return; 00127 } 00128 }