00001 // This is mul/pdf1d/pdf1d_flat_sampler.cxx 00002 00003 //: 00004 // \file 00005 // \author Tim Cootes 00006 // \brief Sampler class for Univariate flat distributions 00007 00008 #include "pdf1d_flat_sampler.h" 00009 00010 #include <vcl_cassert.h> 00011 #include <pdf1d/pdf1d_flat.h> 00012 00013 //======================================================================= 00014 // Dflt ctor 00015 //======================================================================= 00016 00017 pdf1d_flat_sampler::pdf1d_flat_sampler(): 00018 rng_(9667566ul) 00019 { 00020 } 00021 00022 //======================================================================= 00023 // Destructor 00024 //======================================================================= 00025 00026 pdf1d_flat_sampler::~pdf1d_flat_sampler() 00027 { 00028 } 00029 00030 00031 //======================================================================= 00032 // Method: is_a 00033 //======================================================================= 00034 00035 vcl_string pdf1d_flat_sampler::is_a() const 00036 { 00037 return vcl_string("pdf1d_flat_sampler"); 00038 } 00039 00040 //======================================================================= 00041 // Method: is_class 00042 //======================================================================= 00043 00044 bool pdf1d_flat_sampler::is_class(vcl_string const& s) const 00045 { 00046 return pdf1d_sampler::is_class(s) || s==pdf1d_flat_sampler::is_a(); 00047 } 00048 00049 //======================================================================= 00050 // Method: clone 00051 //======================================================================= 00052 00053 pdf1d_sampler* pdf1d_flat_sampler::clone() const 00054 { 00055 return new pdf1d_flat_sampler(*this); 00056 } 00057 //======================================================================= 00058 00059 void pdf1d_flat_sampler::reseed(unsigned long seed) 00060 { 00061 rng_.reseed(seed); 00062 } 00063 //======================================================================= 00064 00065 //: Set model for which this is an instance 00066 // Error check that it is an axis flat. 00067 void pdf1d_flat_sampler::set_model(const pdf1d_pdf& model) 00068 { 00069 assert(model.is_class("pdf1d_flat")); 00070 // cannot use dynamic_cast<> without rtti - PVr 00071 // rtti currently turned off 00072 pdf1d_sampler::set_model(model); 00073 } 00074 00075 //======================================================================= 00076 00077 double pdf1d_flat_sampler::sample() 00078 { 00079 const pdf1d_flat & flat = static_cast<const pdf1d_flat &>(model()); 00080 return rng_.drand64(flat.lo(),flat.hi()); 00081 } 00082 00083 //: Fill x with samples possibly chosen so as to represent the distribution 00084 // 5 or fewer samples requested, they are spaced out equally. 00085 void pdf1d_flat_sampler::regular_samples(vnl_vector<double>& x) 00086 { 00087 int n = x.size(); 00088 const pdf1d_flat & flat = static_cast<const pdf1d_flat &>(model()); 00089 double lo = flat.lo(); 00090 double w = flat.hi()-lo; 00091 00092 double f = w/(n+1); 00093 lo+=f; 00094 for (int i=0;i<n;++i) 00095 x[i] = lo+f*i; 00096 } 00097 00098 00099 //======================================================================= 00100 00101 00102 //: Return a reference to the pdf model 00103 // This is properly cast. 00104 const pdf1d_flat& pdf1d_flat_sampler::flat() const 00105 { 00106 return static_cast<const pdf1d_flat&>(model()); 00107 } 00108