00001 // This is mul/pdf1d/pdf1d_sampler.cxx 00002 00003 //: 00004 // \file 00005 // \author Tim Cootes 00006 // \date 19-Apr-2001 00007 // \brief Base class for Univariate Probability Sampler classes. 00008 00009 #include "pdf1d_sampler.h" 00010 #include <pdf1d/pdf1d_pdf.h> 00011 #include <vsl/vsl_indent.h> 00012 #include <vcl_cassert.h> 00013 00014 //======================================================================= 00015 // Dflt ctor 00016 //======================================================================= 00017 00018 pdf1d_sampler::pdf1d_sampler() 00019 { 00020 } 00021 00022 //======================================================================= 00023 // Destructor 00024 //======================================================================= 00025 00026 pdf1d_sampler::~pdf1d_sampler() 00027 { 00028 } 00029 00030 00031 //: Set model for which this is an instance 00032 void pdf1d_sampler::set_model(const pdf1d_pdf& model) 00033 { 00034 pdf_model_ = &model; 00035 } 00036 00037 //: PDF of which this is an instance 00038 const pdf1d_pdf& pdf1d_sampler::model() const 00039 { 00040 assert (pdf_model_ != 0); 00041 return *pdf_model_; 00042 } 00043 00044 //: Fill x with samples drawn from distribution 00045 void pdf1d_sampler::get_samples(vnl_vector<double>& x) 00046 { 00047 int n = x.size(); 00048 double* x_data = x.data_block(); 00049 for (int i=0;i<n;++i) 00050 x_data[i]=sample(); 00051 } 00052 00053 //: Fill x with samples possibly chosen so as to represent the distribution 00054 // By default simply randomly sample from distribution 00055 void pdf1d_sampler::regular_samples(vnl_vector<double>& x) 00056 { 00057 int n = x.size(); 00058 double* x_data = x.data_block(); 00059 for (int i=0;i<n;++i) 00060 x_data[i]=sample(); 00061 } 00062 00063 //: Fill x with samples possibly chosen so as to represent the distribution 00064 // By default simply randomly sample from distribution 00065 void pdf1d_sampler::regular_samples_and_prob(vnl_vector<double>& x, vnl_vector<double>& p) 00066 { 00067 regular_samples(x); 00068 int n = x.size(); 00069 p.set_size(n); 00070 double* p_data = p.data_block(); 00071 double* x_data = x.data_block(); 00072 00073 for (int i=0;i<n;++i) 00074 p_data[i] = pdf_model_->operator()(x_data[i]); 00075 } 00076 00077 00078 //======================================================================= 00079 // Method: is_a 00080 //======================================================================= 00081 00082 vcl_string pdf1d_sampler::is_a() const 00083 { 00084 return vcl_string("pdf1d_sampler"); 00085 } 00086 00087 //======================================================================= 00088 // Method: is_class 00089 //======================================================================= 00090 00091 bool pdf1d_sampler::is_class(vcl_string const& s) const 00092 { 00093 return s==pdf1d_sampler::is_a(); 00094 } 00095 00096 //======================================================================= 00097 // Method: print 00098 //======================================================================= 00099 00100 // required if data is present in this base class 00101 void pdf1d_sampler::print_summary(vcl_ostream& os) const 00102 { 00103 os << vsl_indent() << "PDF: "; 00104 vsl_print_summary(os, model()); 00105 } 00106 00107 00108 void vsl_print_summary(vcl_ostream& os,const pdf1d_sampler& b) 00109 { 00110 os << b.is_a() << ": "; 00111 vsl_indent_inc(os); 00112 b.print_summary(os); 00113 vsl_indent_dec(os); 00114 } 00115 00116 //======================================================================= 00117 00118 void vsl_print_summary(vcl_ostream& os,const pdf1d_sampler* b) 00119 { 00120 if (b) 00121 vsl_print_summary(os, *b); 00122 else 00123 os << "No pdf1d_sampler defined."; 00124 } 00125