Skip to content

Commit

Permalink
move inline functions from .h to .cpp
Browse files Browse the repository at this point in the history
  • Loading branch information
Soeren Sonnenburg committed Sep 30, 2011
1 parent b18d7b5 commit b6d03b7
Show file tree
Hide file tree
Showing 6 changed files with 165 additions and 108 deletions.
61 changes: 61 additions & 0 deletions src/shogun/clustering/GMM.cpp
Expand Up @@ -671,6 +671,67 @@ float64_t CGMM::get_log_likelihood_example(int32_t num_example)
return 1;
}

float64_t CGMM::get_likelihood_example(int32_t num_example)
{
return CMath::exp(get_log_likelihood_example(num_example));
}

SGVector<float64_t> CGMM::get_nth_mean(int32_t num)
{
ASSERT(num<m_components.vlen);
return m_components.vector[num]->get_mean();
}

void CGMM::set_nth_mean(SGVector<float64_t> mean, int32_t num)
{
ASSERT(num<m_components.vlen);
m_components.vector[num]->set_mean(mean);
}

SGMatrix<float64_t> CGMM::get_nth_cov(int32_t num)
{
ASSERT(num<m_components.vlen);
return m_components.vector[num]->get_cov();
}

void CGMM::set_nth_cov(SGMatrix<float64_t> cov, int32_t num)
{
ASSERT(num<m_components.vlen);
m_components.vector[num]->set_cov(cov);
}

SGVector<float64_t> CGMM::get_coef()
{
return m_coefficients;
}

void CGMM::set_coef(SGVector<float64_t> coefficients)
{
m_coefficients.destroy_vector();
m_coefficients=coefficients;
}

SGVector<CGaussian*> CGMM::get_comp()
{
return m_components;
}

void CGMM::set_comp(SGVector<CGaussian*> components)
{
for (int32_t i=0; i<m_components.vlen; i++)
{
SG_UNREF(m_components.vector[i]);
}

m_components.destroy_vector();
m_components=components;

for (int32_t i=0; i<m_components.vlen; i++)
{
SG_REF(m_components.vector[i]);
}
}

SGMatrix<float64_t> CGMM::alpha_init(SGMatrix<float64_t> init_means)
{
CDotFeatures* dotdata=(CDotFeatures *) features;
Expand Down
74 changes: 18 additions & 56 deletions src/shogun/clustering/GMM.h
Expand Up @@ -50,7 +50,8 @@ class CGMM : public CDistribution
* @param coefficients mixing coefficients
* @param copy true if should be copied
*/
CGMM(SGVector<CGaussian*> components, SGVector<float64_t> coefficients, bool copy=false);
CGMM(SGVector<CGaussian*> components, SGVector<float64_t> coefficients,
bool copy=false);
virtual ~CGMM();

/** cleanup */
Expand All @@ -72,7 +73,8 @@ class CGMM : public CDistribution
*
* @return log likelihood of training data
*/
float64_t train_em(float64_t min_cov=1e-9, int32_t max_iter=1000, float64_t min_change=1e-9);
float64_t train_em(float64_t min_cov=1e-9, int32_t max_iter=1000,
float64_t min_change=1e-9);

/** learn model using SMEM
*
Expand All @@ -84,7 +86,9 @@ class CGMM : public CDistribution
*
* @return log likelihood of training data
*/
float64_t train_smem(int32_t max_iter=100, int32_t max_cand=5, float64_t min_cov=1e-9, int32_t max_em_iter=1000, float64_t min_change=1e-9);
float64_t train_smem(int32_t max_iter=100, int32_t max_cand=5,
float64_t min_cov=1e-9, int32_t max_em_iter=1000,
float64_t min_change=1e-9);

/** maximum likelihood estimation
*
Expand Down Expand Up @@ -131,104 +135,61 @@ class CGMM : public CDistribution
* @param num_example which example
* @return likelihood for example
*/
virtual float64_t get_likelihood_example(int32_t num_example)
{
return CMath::exp(get_log_likelihood_example(num_example));
}
virtual float64_t get_likelihood_example(int32_t num_example);

/** get nth mean
*
* @param num index of mean to retrieve
*
* @return mean
*/
virtual inline SGVector<float64_t> get_nth_mean(int32_t num)
{
ASSERT(num<m_components.vlen);
return m_components.vector[num]->get_mean();
}
virtual SGVector<float64_t> get_nth_mean(int32_t num);

/** set nth mean
*
* @param mean new mean
* @param num index mean to set
*/
virtual inline void set_nth_mean(SGVector<float64_t> mean, int32_t num)
{
ASSERT(num<m_components.vlen);
m_components.vector[num]->set_mean(mean);
}
virtual void set_nth_mean(SGVector<float64_t> mean, int32_t num);

/** get nth covariance
*
* @param num index of covariance to retrieve
*
* @return covariance
*/
virtual inline SGMatrix<float64_t> get_nth_cov(int32_t num)
{
ASSERT(num<m_components.vlen);
return m_components.vector[num]->get_cov();
}
virtual SGMatrix<float64_t> get_nth_cov(int32_t num);

/** set nth covariance
*
* @param cov new covariance
* @param num index of covariance to set
*/
virtual inline void set_nth_cov(SGMatrix<float64_t> cov, int32_t num)
{
ASSERT(num<m_components.vlen);
m_components.vector[num]->set_cov(cov);
}
virtual void set_nth_cov(SGMatrix<float64_t> cov, int32_t num);

/** get coefficients
*
* @return coeffiecients
*/
virtual inline SGVector<float64_t> get_coef()
{
return m_coefficients;
}
virtual SGVector<float64_t> get_coef();

/** set coefficients
*
* @param coefficients mixing coefficients
*/
virtual inline void set_coef(SGVector<float64_t> coefficients)
{
m_coefficients.destroy_vector();
m_coefficients=coefficients;
}
virtual void set_coef(SGVector<float64_t> coefficients);

/** get components
*
* @return components
*/
virtual inline SGVector<CGaussian*> get_comp()
{
return m_components;
}
virtual SGVector<CGaussian*> get_comp();

/** set components
*
* @param components Gaussian components
*/
virtual inline void set_comp(SGVector<CGaussian*> components)
{
for (int32_t i=0; i<m_components.vlen; i++)
{
SG_UNREF(m_components.vector[i]);
}

m_components.destroy_vector();
m_components=components;

for (int32_t i=0; i<m_components.vlen; i++)
{
SG_REF(m_components.vector[i]);
}
}
virtual void set_comp(SGVector<CGaussian*> components);

/** sample from model
*
Expand Down Expand Up @@ -267,7 +228,8 @@ class CGMM : public CDistribution
* @param max_em_iter maximum iterations for EM
* @param min_change minimum change in log likelihood
*/
void partial_em(int32_t comp1, int32_t comp2, int32_t comp3, float64_t min_cov, int32_t max_em_iter, float64_t min_change);
void partial_em(int32_t comp1, int32_t comp2, int32_t comp3,
float64_t min_cov, int32_t max_em_iter, float64_t min_change);

protected:
/** Mixture components */
Expand Down
27 changes: 27 additions & 0 deletions src/shogun/clustering/Hierarchical.cpp
Expand Up @@ -51,6 +51,11 @@ CHierarchical::~CHierarchical()
SG_FREE(pairs);
}

EClassifierType CHierarchical::get_classifier_type()
{
return CT_HIERARCHICAL;
}

bool CHierarchical::train_machine(CFeatures* data)
{
ASSERT(distance);
Expand Down Expand Up @@ -164,6 +169,28 @@ bool CHierarchical::save(FILE* dstfile)
return false;
}


int32_t CHierarchical::get_merges()
{
return merges;
}

SGVector<int32_t> CHierarchical::get_assignment()
{
return SGVector<int32_t>(assignment,table_size);
}

SGVector<float64_t> CHierarchical::get_merge_distances()
{
return SGVector<float64_t>(merge_distance,merges);
}

SGMatrix<int32_t> CHierarchical::get_cluster_pairs()
{
return SGMatrix<int32_t>(pairs,2,merges);
}


void CHierarchical::store_model_features()
{
/* TODO. Currently does nothing since apply methods are not implemented. */
Expand Down
22 changes: 5 additions & 17 deletions src/shogun/clustering/Hierarchical.h
Expand Up @@ -52,7 +52,7 @@ class CHierarchical : public CDistanceMachine
*
* @return classifier type HIERARCHICAL
*/
virtual inline EClassifierType get_classifier_type() { return CT_HIERARCHICAL; }
virtual EClassifierType get_classifier_type();

/** load distance machine from file
*
Expand Down Expand Up @@ -82,34 +82,22 @@ class CHierarchical : public CDistanceMachine
*
* @return merges
*/
inline int32_t get_merges()
{
return merges;
}
int32_t get_merges();

/** get assignment
*
*/
SGVector<int32_t> get_assignment()
{
return SGVector<int32_t>(assignment,table_size);
}
SGVector<int32_t> get_assignment();

/** get merge distance
*
*/
SGVector<float64_t> get_merge_distances()
{
return SGVector<float64_t>(merge_distance,merges);
}
SGVector<float64_t> get_merge_distances();

/** get cluster pairs
*
*/
SGMatrix<int32_t> get_cluster_pairs()
{
return SGMatrix<int32_t>(pairs,2,merges);
}
SGMatrix<int32_t> get_cluster_pairs();

/** @return object name */
inline virtual const char* get_name() const { return "Hierarchical"; }
Expand Down
45 changes: 45 additions & 0 deletions src/shogun/clustering/KMeans.cpp
Expand Up @@ -84,6 +84,51 @@ bool CKMeans::save(FILE* dstfile)
return false;
}


void CKMeans::set_k(int32_t p_k)
{
ASSERT(p_k>0);
this->k=p_k;
}

int32_t CKMeans::get_k()
{
return k;
}

void CKMeans::set_max_iter(int32_t iter)
{
ASSERT(iter>0);
max_iter=iter;
}

float64_t CKMeans::get_max_iter()
{
return max_iter;
}

SGVector<float64_t> CKMeans::get_radiuses()
{
return R;
}

SGMatrix<float64_t> CKMeans::get_cluster_centers()
{
if (!R.vector)
return SGMatrix<float64_t>();

CSimpleFeatures<float64_t>* lhs=
(CSimpleFeatures<float64_t>*)distance->get_lhs();
SGMatrix<float64_t> centers=lhs->get_feature_matrix();
SG_UNREF(lhs);
return centers;
}

int32_t CKMeans::get_dimensions()
{
return dimensions;
}

#ifndef DOXYGEN_SHOULD_SKIP_THIS
struct thread_data
{
Expand Down

0 comments on commit b6d03b7

Please sign in to comment.