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