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