00001 // This is mul/vpdfl/vpdfl_axis_gaussian_sampler.cxx 00002 #ifdef VCL_NEEDS_PRAGMA_INTERFACE 00003 #pragma implementation 00004 #endif 00005 //: 00006 // \file 00007 // \author Ian Scott 00008 // \date 12-Apr-2001 00009 // \brief Sampler class for Multi-Variate axis aligned Gaussian classes. 00010 00011 #include "vpdfl_axis_gaussian_sampler.h" 00012 00013 #include <vcl_cassert.h> 00014 #include <vpdfl/vpdfl_axis_gaussian.h> 00015 00016 //======================================================================= 00017 // Dflt ctor 00018 //======================================================================= 00019 00020 vpdfl_axis_gaussian_sampler::vpdfl_axis_gaussian_sampler(): 00021 rng_(9667566ul) 00022 { 00023 } 00024 00025 //======================================================================= 00026 // Destructor 00027 //======================================================================= 00028 00029 vpdfl_axis_gaussian_sampler::~vpdfl_axis_gaussian_sampler() 00030 { 00031 } 00032 00033 00034 //======================================================================= 00035 // Method: is_a 00036 //======================================================================= 00037 00038 vcl_string vpdfl_axis_gaussian_sampler::is_a() const 00039 { 00040 return vcl_string("vpdfl_axis_gaussian_sampler"); 00041 } 00042 00043 //======================================================================= 00044 // Method: is_class 00045 //======================================================================= 00046 00047 bool vpdfl_axis_gaussian_sampler::is_class(vcl_string const& s) const 00048 { 00049 return vpdfl_sampler_base::is_class(s) || s==vpdfl_axis_gaussian_sampler::is_a(); 00050 } 00051 00052 //======================================================================= 00053 // Method: clone 00054 //======================================================================= 00055 00056 vpdfl_sampler_base* vpdfl_axis_gaussian_sampler::clone() const 00057 { 00058 return new vpdfl_axis_gaussian_sampler(*this); 00059 } 00060 //======================================================================= 00061 00062 void vpdfl_axis_gaussian_sampler::reseed(unsigned long seed) 00063 { 00064 rng_.reseed(seed); 00065 } 00066 //======================================================================= 00067 00068 //: Set model for which this is an instance 00069 // Error check that it is an axis gaussian. 00070 void vpdfl_axis_gaussian_sampler::set_model(const vpdfl_pdf_base& model) 00071 { 00072 assert(model.is_class("vpdfl_axis_gaussian")); 00073 // cannot use dynamic_cast<> without rtti - PVr 00074 // rtti currently turned off 00075 vpdfl_sampler_base::set_model(model); 00076 } 00077 00078 //======================================================================= 00079 00080 void vpdfl_axis_gaussian_sampler::sample(vnl_vector<double>& x) 00081 { 00082 const vpdfl_axis_gaussian & gauss = static_cast<const vpdfl_axis_gaussian &>( model()); 00083 const double *s = gauss.sd().data_block(); 00084 const double *m = gauss.mean().data_block(); 00085 int n = gauss.n_dims(); 00086 00087 x.set_size(n); 00088 00089 double* x_data = x.data_block(); 00090 for (int i=0;i<n;++i) 00091 x_data[i] = m[i] + s[i]*rng_.normal(); 00092 } 00093 00094 //======================================================================= 00095 00096 00097 //: Return a reference to the pdf model 00098 // This is properly cast. 00099 const vpdfl_axis_gaussian& vpdfl_axis_gaussian_sampler::axis_gaussian() const 00100 { 00101 return static_cast<const vpdfl_axis_gaussian&>(model()); 00102 } 00103