contrib/mul/mfpf/mfpf_sad_vec_cost.cxx
Go to the documentation of this file.
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 }