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