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 }