00001 /* 00002 * Hybrid.h 00003 * 00004 * Created on: Sep 20, 2011 00005 * Author: sdries 00006 */ 00007 00008 #ifndef PROBLIB_HYBRIDPDF_H_ 00009 #define PROBLIB_HYBRIDPDF_H_ 00010 00011 #include "PDF.h" 00012 00013 namespace pbl { 00014 00015 class Hybrid: public PDF { 00016 00017 public: 00018 00019 Hybrid(); 00020 00021 Hybrid(const Hybrid& orig); 00022 00023 virtual ~Hybrid(); 00024 00025 Hybrid& operator=(const Hybrid& other); 00026 00027 Hybrid* clone() const; 00028 00029 virtual double getLikelihood(const PDF& pdf) const; 00030 00031 void clear(); 00032 00033 double getMaxDensity() const; 00034 00035 void addPDF(const PDF& pdf, double priority); 00036 00037 const std::vector<PDF*>& getPDFS() const; 00038 00039 std::string toString(const std::string& indent = "") const; 00040 00041 protected: 00042 00043 struct HybridStruct { 00044 00045 std::vector<PDF*> pdfs_; 00046 00047 int n_ptrs_; 00048 00049 HybridStruct() : n_ptrs_(1) { } 00050 00051 HybridStruct(const HybridStruct& orig) : n_ptrs_(1) { 00052 00053 for (std::vector<PDF*>::const_iterator it_pdf = orig.pdfs_.begin(); it_pdf != orig.pdfs_.end(); ++it_pdf) { 00054 pdfs_.push_back((*it_pdf)->clone()); 00055 } 00056 } 00057 00058 ~HybridStruct() { 00059 for (std::vector<PDF*>::const_iterator it_pdf = pdfs_.begin(); it_pdf != pdfs_.end(); ++it_pdf) { 00060 delete *it_pdf; 00061 } 00062 } 00063 }; 00064 00065 HybridStruct* ptr_; 00066 00067 void cloneStruct(); 00068 00069 }; 00070 00071 } 00072 00073 #endif /* HYBRIDPDF_H_ */