SHOGUN
v3.2.0
|
00001 /* 00002 * This program is free software; you can redistribute it and/or modify 00003 * it under the terms of the GNU General Public License as published by 00004 * the Free Software Foundation; either version 3 of the License, or 00005 * (at your option) any later version. 00006 * 00007 * Written (W) 2013 Heiko Strathmann 00008 */ 00009 00010 #include <shogun/distributions/classical/ProbabilityDistribution.h> 00011 #include <shogun/base/Parameter.h> 00012 #include <shogun/lib/SGVector.h> 00013 #include <shogun/lib/SGMatrix.h> 00014 00015 using namespace shogun; 00016 00017 CProbabilityDistribution::CProbabilityDistribution() : CSGObject() 00018 { 00019 init(); 00020 } 00021 00022 CProbabilityDistribution::CProbabilityDistribution(int32_t dimension) : 00023 CSGObject() 00024 { 00025 init(); 00026 00027 REQUIRE(dimension>0, "Dimension of Distribution must be positive\n", 00028 dimension); 00029 00030 m_dimension=dimension; 00031 } 00032 00033 00034 CProbabilityDistribution::~CProbabilityDistribution() 00035 { 00036 00037 } 00038 00039 SGMatrix<float64_t> CProbabilityDistribution::sample(int32_t num_samples, 00040 SGMatrix<float64_t> pre_samples) const 00041 { 00042 SG_ERROR("Not implemented in sub-class\n"); 00043 return SGMatrix<float64_t>(); 00044 } 00045 00046 SGVector<float64_t> CProbabilityDistribution::sample() const 00047 { 00048 SGMatrix<float64_t> s=sample(1); 00049 SGVector<float64_t> result(m_dimension); 00050 memcpy(result.vector, s.matrix, m_dimension*sizeof(float64_t)); 00051 return result; 00052 } 00053 00054 SGVector<float64_t> CProbabilityDistribution::log_pdf_multiple( 00055 SGMatrix<float64_t> samples) const 00056 { 00057 SG_ERROR("Not implemented in sub-class\n"); 00058 return SGVector<float64_t>(); 00059 } 00060 00061 float64_t CProbabilityDistribution::log_pdf(SGVector<float64_t> sample_vec) const 00062 { 00063 REQUIRE(sample_vec.vlen==m_dimension, "Sample dimension (%d) does not " 00064 "match dimension of distribution (%d)\n", sample_vec.vlen, 00065 m_dimension); 00066 00067 SGMatrix<float64_t> s(m_dimension, 1); 00068 memcpy(s.matrix, sample_vec.vector, m_dimension*sizeof(float64_t)); 00069 return log_pdf_multiple(s)[0]; 00070 } 00071 00072 void CProbabilityDistribution::init() 00073 { 00074 m_dimension=0; 00075 00076 SG_ADD(&m_dimension, "dimension", "Dimension of distribution.", 00077 MS_NOT_AVAILABLE); 00078 }