contrib/mul/mcal/mcal_trivial_ca.cxx
Go to the documentation of this file.
00001 #include "mcal_trivial_ca.h"
00002 //:
00003 // \file
00004 // \author Tim Cootes
00005 // \brief Generates set of axis aligned modes for non-zero elements
00006 
00007 #include <vcl_cstdlib.h>
00008 #include <vcl_string.h>
00009 #include <vcl_sstream.h>
00010 
00011 #include <vsl/vsl_binary_io.h>
00012 #include <vnl/vnl_vector.h>
00013 #include <mbl/mbl_parse_block.h>
00014 #include <mbl/mbl_read_props.h>
00015 #include <mbl/mbl_exception.h>
00016 #include <mbl/mbl_stats_nd.h>
00017 
00018 //=======================================================================
00019 // Constructors
00020 //=======================================================================
00021 
00022 mcal_trivial_ca::mcal_trivial_ca()
00023 {
00024 }
00025 
00026 
00027 //=======================================================================
00028 // Destructor
00029 //=======================================================================
00030 
00031 mcal_trivial_ca::~mcal_trivial_ca()
00032 {
00033 }
00034 
00035 
00036 //: Compute modes of the supplied data relative to the supplied mean
00037 //  Model is x = mean + modes*b,  where b is a vector of weights on each mode.
00038 //  mode_var[i] gives the variance of the data projected onto that mode.
00039 void mcal_trivial_ca::build_about_mean(mbl_data_wrapper<vnl_vector<double> >& data,
00040                                        const vnl_vector<double>& mean,
00041                                        vnl_matrix<double>& modes,
00042                                        vnl_vector<double>& mode_var)
00043 {
00044   if (data.size()==0)
00045   {
00046     vcl_cerr<<"mcal_trivial_ca::build_about_mean() No samples supplied.\n";
00047     vcl_abort();
00048   }
00049 
00050   data.reset();
00051 
00052   if (data.current().size()==0)
00053   {
00054     vcl_cerr<<"mcal_trivial_ca::build_about_mean()\n"
00055             <<"Warning: Samples claim to have zero dimensions.\n"
00056             <<"Constructing empty model.\n";
00057 
00058     modes.set_size(0,0);
00059     mode_var.set_size(0);
00060     return;
00061   }
00062 
00063   mbl_stats_nd stats;
00064   data.reset();
00065   do
00066   {
00067     stats.obs(data.current()-mean);
00068   } while (data.next());
00069 
00070   // Count non-zero variance elements
00071   unsigned nc = 0;
00072   unsigned n = stats.sumSq().size();
00073   for (unsigned i=0;i<n;++i)
00074     if (stats.sumSq()[i]>0) nc++;
00075 
00076   modes.set_size(n,nc);
00077   modes.fill(0.0);
00078   mode_var.set_size(nc);
00079   unsigned k=0;
00080   for (unsigned i=0;i<n;++i)
00081   {
00082     if (stats.sumSq()[i]>0)
00083     {
00084       modes(i,k)=1.0;  // Create unit vector
00085       mode_var[k]=stats.sumSq()[i]/stats.n_obs();
00086       ++k;
00087     }
00088   }
00089 }
00090 
00091 
00092 //=======================================================================
00093 // Method: is_a
00094 //=======================================================================
00095 
00096 vcl_string  mcal_trivial_ca::is_a() const
00097 {
00098   return vcl_string("mcal_trivial_ca");
00099 }
00100 
00101 //=======================================================================
00102 // Method: version_no
00103 //=======================================================================
00104 
00105 short mcal_trivial_ca::version_no() const
00106 {
00107   return 1;
00108 }
00109 
00110 //=======================================================================
00111 // Method: clone
00112 //=======================================================================
00113 
00114 mcal_component_analyzer* mcal_trivial_ca::clone() const
00115 {
00116   return new mcal_trivial_ca(*this);
00117 }
00118 
00119 //=======================================================================
00120 // Method: print
00121 //=======================================================================
00122 
00123 void mcal_trivial_ca::print_summary(vcl_ostream& os) const
00124 {
00125 }
00126 
00127 //=======================================================================
00128 // Method: save
00129 //=======================================================================
00130 
00131 void mcal_trivial_ca::b_write(vsl_b_ostream& bfs) const
00132 {
00133   vsl_b_write(bfs,version_no());
00134 }
00135 
00136 //=======================================================================
00137 // Method: load
00138 //=======================================================================
00139 
00140 void mcal_trivial_ca::b_read(vsl_b_istream& bfs)
00141 {
00142   short version;
00143   vsl_b_read(bfs,version);
00144   switch (version)
00145   {
00146     case 1:
00147       break;
00148     default:
00149       vcl_cerr << "mcal_trivial_ca::b_read()\n"
00150                << "Unexpected version number " << version << vcl_endl;
00151       vcl_abort();
00152   }
00153 }
00154 
00155 //=======================================================================
00156 //: Read initialisation settings from a stream.
00157 // Parameters:
00158 // \verbatim
00159 // {
00160 // }
00161 // \endverbatim
00162 // \throw mbl_exception_parse_error if the parse fails.
00163 void mcal_trivial_ca::config_from_stream(vcl_istream & is)
00164 {
00165   vcl_string s = mbl_parse_block(is);
00166 
00167   vcl_istringstream ss(s);
00168   mbl_read_props_type props = mbl_read_props_ws(ss);
00169 
00170   try
00171   {
00172     mbl_read_props_look_for_unused_props(
00173           "mcal_trivial_ca::config_from_stream", props);
00174   }
00175   catch(mbl_exception_unused_props &e)
00176   {
00177     throw mbl_exception_parse_error(e.what());
00178   }
00179 }