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