From eda5bc26f44ee9a6f83dcf8c91f17296d7fc509d Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Mon, 12 Feb 2024 14:52:43 +0100 Subject: Move into version control --- .../include/armadillo_bits/gmm_diag_bones.hpp | 179 +++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 src/armadillo/include/armadillo_bits/gmm_diag_bones.hpp (limited to 'src/armadillo/include/armadillo_bits/gmm_diag_bones.hpp') diff --git a/src/armadillo/include/armadillo_bits/gmm_diag_bones.hpp b/src/armadillo/include/armadillo_bits/gmm_diag_bones.hpp new file mode 100644 index 0000000..386a40d --- /dev/null +++ b/src/armadillo/include/armadillo_bits/gmm_diag_bones.hpp @@ -0,0 +1,179 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) +// Copyright 2008-2016 National ICT Australia (NICTA) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + + +//! \addtogroup gmm_diag +//! @{ + + +namespace gmm_priv +{ + +template +class gmm_diag + { + public: + + arma_aligned const Mat means; + arma_aligned const Mat dcovs; + arma_aligned const Row hefts; + + // + // + + inline ~gmm_diag(); + inline gmm_diag(); + + inline gmm_diag(const gmm_diag& x); + inline gmm_diag& operator=(const gmm_diag& x); + + inline explicit gmm_diag(const gmm_full& x); + inline gmm_diag& operator=(const gmm_full& x); + + inline gmm_diag(const uword in_n_dims, const uword in_n_gaus); + inline void reset(const uword in_n_dims, const uword in_n_gaus); + inline void reset(); + + template + inline void set_params(const Base& in_means, const Base& in_dcovs, const Base& in_hefts); + + template inline void set_means(const Base& in_means); + template inline void set_dcovs(const Base& in_dcovs); + template inline void set_hefts(const Base& in_hefts); + + inline uword n_dims() const; + inline uword n_gaus() const; + + inline bool load(const std::string name); + inline bool save(const std::string name) const; + + inline Col generate() const; + inline Mat generate(const uword N) const; + + template inline eT log_p(const T1& expr, const gmm_empty_arg& junk1 = gmm_empty_arg(), typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == true ))>::result* junk2 = nullptr) const; + template inline eT log_p(const T1& expr, const uword gaus_id, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == true ))>::result* junk2 = nullptr) const; + + template inline Row log_p(const T1& expr, const gmm_empty_arg& junk1 = gmm_empty_arg(), typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == false))>::result* junk2 = nullptr) const; + template inline Row log_p(const T1& expr, const uword gaus_id, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == false))>::result* junk2 = nullptr) const; + + template inline eT sum_log_p(const Base& expr) const; + template inline eT sum_log_p(const Base& expr, const uword gaus_id) const; + + template inline eT avg_log_p(const Base& expr) const; + template inline eT avg_log_p(const Base& expr, const uword gaus_id) const; + + template inline uword assign(const T1& expr, const gmm_dist_mode& dist, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == true ))>::result* junk = nullptr) const; + template inline urowvec assign(const T1& expr, const gmm_dist_mode& dist, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == false))>::result* junk = nullptr) const; + + template inline urowvec raw_hist(const Base& expr, const gmm_dist_mode& dist_mode) const; + template inline Row norm_hist(const Base& expr, const gmm_dist_mode& dist_mode) const; + + template + inline + bool + learn + ( + const Base& data, + const uword n_gaus, + const gmm_dist_mode& dist_mode, + const gmm_seed_mode& seed_mode, + const uword km_iter, + const uword em_iter, + const eT var_floor, + const bool print_mode + ); + + + template + inline + bool + kmeans_wrapper + ( + Mat& user_means, + const Base& data, + const uword n_gaus, + const gmm_seed_mode& seed_mode, + const uword km_iter, + const bool print_mode + ); + + + // + + protected: + + arma_aligned Mat inv_dcovs; + arma_aligned Row log_det_etc; + arma_aligned Row log_hefts; + arma_aligned Col mah_aux; + + // + + inline void init(const gmm_diag& x); + inline void init(const gmm_full& x); + + inline void init(const uword in_n_dim, const uword in_n_gaus); + + inline void init_constants(); + + inline umat internal_gen_boundaries(const uword N) const; + + inline eT internal_scalar_log_p(const eT* x ) const; + inline eT internal_scalar_log_p(const eT* x, const uword gaus_id) const; + + inline Row internal_vec_log_p(const Mat& X ) const; + inline Row internal_vec_log_p(const Mat& X, const uword gaus_id) const; + + inline eT internal_sum_log_p(const Mat& X ) const; + inline eT internal_sum_log_p(const Mat& X, const uword gaus_id) const; + + inline eT internal_avg_log_p(const Mat& X ) const; + inline eT internal_avg_log_p(const Mat& X, const uword gaus_id) const; + + inline uword internal_scalar_assign(const Mat& X, const gmm_dist_mode& dist_mode) const; + + inline void internal_vec_assign(urowvec& out, const Mat& X, const gmm_dist_mode& dist_mode) const; + + inline void internal_raw_hist(urowvec& hist, const Mat& X, const gmm_dist_mode& dist_mode) const; + + // + + template inline void generate_initial_means(const Mat& X, const gmm_seed_mode& seed); + + template inline void generate_initial_params(const Mat& X, const eT var_floor); + + template inline bool km_iterate(const Mat& X, const uword max_iter, const bool verbose, const char* signature); + + // + + inline bool em_iterate(const Mat& X, const uword max_iter, const eT var_floor, const bool verbose); + + inline void em_update_params(const Mat& X, const umat& boundaries, field< Mat >& t_acc_means, field< Mat >& t_acc_dcovs, field< Col >& t_acc_norm_lhoods, field< Col >& t_gaus_log_lhoods, Col& t_progress_log_lhoods); + + inline void em_generate_acc(const Mat& X, const uword start_index, const uword end_index, Mat& acc_means, Mat& acc_dcovs, Col& acc_norm_lhoods, Col& gaus_log_lhoods, eT& progress_log_lhood) const; + + inline void em_fix_params(const eT var_floor); + }; + +} + + +typedef gmm_priv::gmm_diag gmm_diag; +typedef gmm_priv::gmm_diag fgmm_diag; + + +//! @} -- cgit v1.2.1