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