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