SHOGUN  3.2.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Factor.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) 2013 Shell Hu
8  * Copyright (C) 2013 Shell Hu
9  */
10 
12 #include <shogun/base/Parameter.h>
13 
14 using namespace shogun;
15 
17 {
18  SG_UNSTABLE("CFactor::CFactor()", "\n");
19  init();
20 }
21 
23  SGVector<int32_t> var_index,
25 {
26  init();
27  m_factor_type = ftype;
28  m_var_index = var_index;
29  m_data = data;
30  m_is_data_dep = true;
31 
32  ASSERT(m_factor_type != NULL);
34 
35  if (m_data.size() == 0)
36  m_is_data_dep = false;
37 
38  if (ftype->is_table() && m_is_data_dep)
40 
43 }
44 
46  SGVector<int32_t> var_index,
47  SGSparseVector<float64_t> data_sparse) : CSGObject()
48 {
49  init();
50  m_factor_type = ftype;
51  m_var_index = var_index;
52  m_data_sparse = data_sparse;
53  m_is_data_dep = true;
54 
55  ASSERT(m_factor_type != NULL);
57 
59  m_is_data_dep = false;
60 
61  if (ftype->is_table() && m_is_data_dep)
63 
66 }
67 
69  SGVector<int32_t> var_index,
70  CFactorDataSource* data_source) : CSGObject()
71 {
72  init();
73  m_factor_type = ftype;
74  m_var_index = var_index;
75  m_data_source = data_source;
76  m_is_data_dep = true;
77 
78  ASSERT(m_factor_type != NULL);
80  ASSERT(m_data_source != NULL);
81 
82  if (ftype->is_table())
84 
87 }
88 
90 {
93 }
94 
96 {
98  return m_factor_type;
99 }
100 
102 {
103  m_factor_type = ftype;
105 }
106 
108 {
109  return m_var_index;
110 }
111 
113 {
114  m_var_index = vars.clone();
115 }
116 
118 {
120 }
121 
123 {
124  if (m_data_source != NULL)
125  return m_data_source->get_data();
126 
127  return m_data;
128 }
129 
131 {
132  if (m_data_source != NULL)
133  return m_data_source->get_data_sparse();
134 
135  return m_data_sparse;
136 }
137 
139 {
140  m_data = data_dense.clone();
141  m_is_data_dep = true;
142 }
143 
145  int32_t dlen)
146 {
147  m_data_sparse = SGSparseVector<float64_t>(data_sparse, dlen);
148  m_is_data_dep = true;
149 }
150 
152 {
153  return m_is_data_dep;
154 }
155 
157 {
158  if (m_data_source != NULL)
159  return m_data_source->is_sparse();
160 
161  return (m_data.size() == 0);
162 }
163 
165 {
166  if (is_data_dependent() == false && m_energies.size() == 0)
167  {
168  const SGVector<float64_t> ft_energies = m_factor_type->get_w();
169  ASSERT(ft_energies.size() == m_factor_type->get_num_assignments());
170  return ft_energies;
171  }
172  return m_energies;
173 }
174 
175 float64_t CFactor::get_energy(int32_t index) const
176 {
177  return get_energies()[index]; // note for data indep, we get m_w not m_energies
178 }
179 
181 {
182  REQUIRE(m_factor_type->get_num_assignments() == ft_energies.size(),
183  "%s::set_energies(): ft_energies is not a valid energy table!\n", get_name());
184 
185  m_energies = ft_energies;
186 }
187 
188 void CFactor::set_energy(int32_t ei, float64_t value)
189 {
190  REQUIRE(ei >= 0 && ei < m_factor_type->get_num_assignments(),
191  "%s::set_energy(): ei is out of index!\n", get_name());
192 
193  REQUIRE(is_data_dependent(), "%s::set_energy(): \
194  energy table is fixed in data dependent factor!\n", get_name());
195 
196  m_energies[ei] = value;
197 }
198 
200 {
202  return get_energy(index);
203 }
204 
206 {
207  if (is_data_dependent() == false)
208  return;
209 
210  // For some factor types the size of the energy table is determined only
211  // after an initialization step from training data.
212  if (m_energies.size() == 0)
214 
215  const SGVector<float64_t> H = get_data();
216  const SGSparseVector<float64_t> H_sparse = get_data_sparse();
217 
218  if (H_sparse.num_feat_entries == 0)
220  else
222 }
223 
225  const SGVector<float64_t> marginals,
226  SGVector<float64_t>& parameter_gradient,
227  float64_t mult) const
228 {
229  const SGVector<float64_t> H = get_data();
230  const SGSparseVector<float64_t> H_sparse = get_data_sparse();
231 
232  if (H_sparse.num_feat_entries == 0)
233  m_factor_type->compute_gradients(H, marginals, parameter_gradient, mult);
234  else
235  m_factor_type->compute_gradients(H_sparse, marginals, parameter_gradient, mult);
236 }
237 
238 void CFactor::init()
239 {
240  SG_ADD((CSGObject**)&m_factor_type, "type_name", "Factor type name", MS_NOT_AVAILABLE);
241  SG_ADD(&m_var_index, "var_index", "Factor variable index", MS_NOT_AVAILABLE);
242  SG_ADD(&m_energies, "energies", "Factor energies", MS_NOT_AVAILABLE);
243  SG_ADD((CSGObject**)&m_data_source, "data_source", "Factor data source", MS_NOT_AVAILABLE);
244  SG_ADD(&m_data, "data", "Factor data", MS_NOT_AVAILABLE);
245  SG_ADD(&m_data_sparse, "data_sparse", "Sparse factor data", MS_NOT_AVAILABLE);
246  SG_ADD(&m_is_data_dep, "is_data_dep", "Factor is data dependent or not", MS_NOT_AVAILABLE);
247 
248  m_factor_type=NULL;
249  m_data_source=NULL;
250  m_is_data_dep = false;
251 }
252 
254 {
255  init();
256 }
257 
259  : CSGObject()
260 {
261  init();
262  m_dense = dense;
263 }
264 
266  : CSGObject()
267 {
268  init();
269  m_sparse = sparse;
270 }
271 
273 {
274 }
275 
277 {
278  return (m_dense.size() == 0);
279 }
280 
282 {
283  return m_dense;
284 }
285 
287 {
288  return m_sparse;
289 }
290 
292 {
293  m_dense = dense.clone();
294 }
295 
297  int32_t dlen)
298 {
299  m_sparse = SGSparseVector<float64_t>(sparse, dlen);
300 }
301 
302 void CFactorDataSource::init()
303 {
304  SG_ADD(&m_dense, "dense", "Shared data", MS_NOT_AVAILABLE);
305  SG_ADD(&m_sparse, "sparse", "Shared sparse data", MS_NOT_AVAILABLE);
306 }
307 

SHOGUN Machine Learning Toolbox - Documentation