LDA++
LDA.hpp
1 #ifndef _LDAPLUSPLUS_LDA_HPP_
2 #define _LDAPLUSPLUS_LDA_HPP_
3 
4 
5 #include <condition_variable>
6 #include <list>
7 #include <memory>
8 #include <mutex>
9 #include <vector>
10 #include <thread>
11 #include <tuple>
12 
13 #include <Eigen/Core>
14 
15 #include "ldaplusplus/events/Events.hpp"
16 #include "ldaplusplus/em/EStepInterface.hpp"
17 #include "ldaplusplus/em/MStepInterface.hpp"
18 #include "ldaplusplus/Parameters.hpp"
19 
20 namespace ldaplusplus {
21 
22 
34 template <typename Scalar = double>
35 class LDA
36 {
37  typedef Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> MatrixX;
38  typedef Eigen::Matrix<Scalar, Eigen::Dynamic, 1> VectorX;
39 
40  public:
57  LDA(
58  std::shared_ptr<parameters::Parameters> model_parameters,
59  std::shared_ptr<em::EStepInterface<Scalar> > e_step,
60  std::shared_ptr<em::MStepInterface<Scalar> > m_step,
61  size_t iterations = 20,
62  size_t workers = 1
63  );
64 
68  LDA(LDA &&lda);
69 
82  void fit(const Eigen::MatrixXi &X, const Eigen::VectorXi &y);
83 
95  void fit(const Eigen::MatrixXi &X);
96 
106  void partial_fit(const Eigen::MatrixXi &X, const Eigen::VectorXi &y);
107 
114  void partial_fit(std::shared_ptr<corpus::Corpus> corpus);
115 
124  MatrixX transform(const Eigen::MatrixXi &X);
125 
142  MatrixX decision_function(const Eigen::MatrixXi &X);
143 
154  Eigen::VectorXi predict(const Eigen::MatrixXi &X);
155 
165  std::tuple<MatrixX, Eigen::VectorXi> transform_predict(const Eigen::MatrixXi &X);
166 
170  std::shared_ptr<events::EventDispatcherInterface> get_event_dispatcher() {
171  return event_dispatcher_;
172  }
173 
177  const std::shared_ptr<parameters::Parameters> model_parameters() {
178  return model_parameters_;
179  }
180 
181  template <typename P>
182  const std::shared_ptr<P> model_parameters() {
183  return std::static_pointer_cast<P>(model_parameters_);
184  }
185 
186  protected:
190  std::shared_ptr<corpus::Corpus> get_corpus(
191  const Eigen::MatrixXi &X,
192  const Eigen::VectorXi &y
193  );
194 
198  std::shared_ptr<corpus::Corpus> get_corpus(const Eigen::MatrixXi &X);
199 
203  void create_worker_pool();
204 
208  void destroy_worker_pool();
209 
215  std::static_pointer_cast<events::ThreadSafeEventDispatcher>(
216  event_dispatcher_
217  )->process_events();
218  }
219 
224  std::tuple<std::shared_ptr<parameters::Parameters>, size_t> extract_vp_from_queue();
225 
229  void doc_e_step_worker();
230 
240  MatrixX decision_function(const MatrixX &X);
241 
245  Eigen::VectorXi predict(const MatrixX &scores);
246 
247 
248  private:
253  void set_up_event_dispatcher();
254 
255  // The model parameters
256  std::shared_ptr<parameters::Parameters> model_parameters_;
257 
258  // The LDA implementation
259  std::shared_ptr<em::EStepInterface<Scalar> > e_step_;
260  std::shared_ptr<em::MStepInterface<Scalar> > m_step_;
261 
262  // Member variables that affect the behaviour of fit
263  size_t iterations_;
264 
265  // The thread related member variables
266  std::vector<std::thread> workers_;
267  std::mutex queue_in_mutex_;
268  std::list<std::tuple<std::shared_ptr<corpus::Corpus>, size_t> > queue_in_;
269  std::mutex queue_out_mutex_;
270  std::condition_variable queue_out_cv_;
271  std::list<std::tuple<std::shared_ptr<parameters::Parameters>, size_t> > queue_out_;
272 
273  // An event dispatcher that we will use to communicate with the
274  // external components
275  std::shared_ptr<events::EventDispatcherInterface> event_dispatcher_;
276 };
277 
278 
279 } // namespace ldaplusplus
280 #endif // _LDAPLUSPLUS_LDA_HPP_
void fit(const Eigen::MatrixXi &X, const Eigen::VectorXi &y)
Definition: LDA.cpp:65
void destroy_worker_pool()
Definition: LDA.cpp:243
LDA(std::shared_ptr< parameters::Parameters > model_parameters, std::shared_ptr< em::EStepInterface< Scalar > > e_step, std::shared_ptr< em::MStepInterface< Scalar > > m_step, size_t iterations=20, size_t workers=1)
Definition: LDA.cpp:14
MatrixX transform(const Eigen::MatrixXi &X)
Definition: LDA.cpp:139
void process_worker_events()
Definition: LDA.hpp:214
std::tuple< MatrixX, Eigen::VectorXi > transform_predict(const Eigen::MatrixXi &X)
Definition: LDA.cpp:222
std::shared_ptr< corpus::Corpus > get_corpus(const Eigen::MatrixXi &X, const Eigen::VectorXi &y)
Definition: LDA.cpp:50
std::shared_ptr< events::EventDispatcherInterface > get_event_dispatcher()
Definition: LDA.hpp:170
void partial_fit(const Eigen::MatrixXi &X, const Eigen::VectorXi &y)
Definition: LDA.cpp:85
std::tuple< std::shared_ptr< parameters::Parameters >, size_t > extract_vp_from_queue()
Definition: LDA.cpp:283
const std::shared_ptr< parameters::Parameters > model_parameters()
Definition: LDA.hpp:177
MatrixX decision_function(const Eigen::MatrixXi &X)
Definition: LDA.cpp:180
void create_worker_pool()
Definition: LDA.cpp:233
void doc_e_step_worker()
Definition: LDA.cpp:251
Eigen::VectorXi predict(const Eigen::MatrixXi &X)
Definition: LDA.cpp:204
Definition: Document.hpp:11