SHOGUN  v2.0.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
KernelMulticlassMachine.cpp
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 3 of the License, or
5  * (at your option) any later version.
6  *
7  * Written (W) 2012 Chiyuan Zhang
8  * Written (W) 2012 Heiko Strathmann
9  * Copyright (C) 2012 Chiyuan Zhang
10  */
11 
12 #include <shogun/lib/Set.h>
14 
15 using namespace shogun;
16 
18 {
19  CKernel *kernel= m_kernel;
20  if (!kernel)
21  SG_ERROR("%s::store_model_features(): kernel is needed to store SV "
22  "features.\n", get_name());
23 
24  CFeatures* lhs=kernel->get_lhs();
25  CFeatures* rhs=kernel->get_rhs();
26  if (!lhs)
27  {
28  SG_ERROR("%s::store_model_features(): kernel lhs is needed to store "
29  "SV features.\n", get_name());
30  }
31 
32  /* this map will be abused as a map */
33  CSet<index_t> all_sv;
34  for (index_t i=0; i<m_machines->get_num_elements(); ++i)
35  {
37  for (index_t j=0; j<machine->get_num_support_vectors(); ++j)
38  all_sv.add(machine->get_support_vector(j));
39 
40  SG_UNREF(machine);
41  }
42 
43  /* convert map to vector of SV */
44  SGVector<index_t> sv_idx(all_sv.get_num_elements());
45  for (index_t i=0; i<sv_idx.vlen; ++i)
46  sv_idx[i]=*all_sv.get_element_ptr(i);
47 
48  CFeatures* sv_features=lhs->copy_subset(sv_idx);
49 
50  /* now, features are replaced by concatenated SV features */
51  kernel->init(sv_features, rhs);
52 
53  /* was SG_REF'ed by copy_subset */
54  SG_UNREF(sv_features);
55 
56  /* now the old SV indices have to be mapped to the new features */
57 
58  /* update SV of all machines */
59  for (int32_t i=0; i<m_machines->get_num_elements(); ++i)
60  {
62 
63  /* for each machine, replace SV by index in sv_idx array */
64  for (int32_t j=0; j<machine->get_num_support_vectors(); ++j)
65  {
66  /* get index of SV in old features */
67  index_t current_sv_idx=machine->get_support_vector(j);
68 
69  /* the position of this old index in the map is the position of
70  * the SV in the new features */
71  index_t new_sv_idx=all_sv.index_of(current_sv_idx);
72 
73  machine->set_support_vector(j, new_sv_idx);
74  }
75 
76  SG_UNREF(machine);
77  }
78 
79  SG_UNREF(lhs);
80  SG_UNREF(rhs);
81 }

SHOGUN Machine Learning Toolbox - Documentation