SHOGUN  3.2.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
PlifMatrix.cpp
Go to the documentation of this file.
5 
6 using namespace shogun;
7 
8 CPlifMatrix::CPlifMatrix() : m_PEN(NULL), m_num_plifs(0), m_num_limits(0),
9  m_num_states(0), m_feat_dim3(0), m_plif_matrix(NULL), m_state_signals(NULL)
10 {
11 }
12 
14 {
15  for (int32_t i=0; i<m_num_plifs; i++)
16  delete m_PEN[i];
17  SG_FREE(m_PEN);
18 
19  for (int32_t i=0; i<m_num_states*m_num_states; i++)
20  delete m_plif_matrix[i];
21 
22  SG_FREE(m_plif_matrix);
23 
24  SG_FREE(m_state_signals);
25 }
26 
27 void CPlifMatrix::create_plifs(int32_t num_plifs, int32_t num_limits)
28 {
29  for (int32_t i=0; i<m_num_plifs; i++)
30  delete m_PEN[i];
31  SG_FREE(m_PEN);
32  m_PEN=NULL;
33 
34  m_num_plifs=num_plifs;
35  m_num_limits=num_limits;
36  m_PEN = SG_MALLOC(CPlif*, num_plifs);
37  for (int32_t i=0; i<num_plifs; i++)
38  m_PEN[i]=new CPlif(num_limits) ;
39 }
40 
42 {
43  if (plif_ids.vlen!=m_num_plifs)
44  SG_ERROR("plif_ids size mismatch (num_ids=%d vs.num_plifs=%d)\n", plif_ids.vlen, m_num_plifs)
45 
47  m_ids.set_array(plif_ids.vector, plif_ids.vlen, true, true);
48 
49  for (int32_t i=0; i<m_num_plifs; i++)
50  {
51  int32_t id=get_plif_id(i);
52  m_PEN[id]->set_id(id);
53  }
54 }
55 
57 {
58  if (min_values.vlen!=m_num_plifs)
59  SG_ERROR("plif_values size mismatch (num_values=%d vs.num_plifs=%d)\n", min_values.vlen, m_num_plifs)
60 
61  for (int32_t i=0; i<m_num_plifs; i++)
62  {
63  int32_t id=get_plif_id(i);
64  m_PEN[id]->set_min_value(min_values.vector[i]);
65  }
66 }
67 
69 {
70  if (max_values.vlen!=m_num_plifs)
71  SG_ERROR("plif_values size mismatch (num_values=%d vs.num_plifs=%d)\n", max_values.vlen, m_num_plifs)
72 
73  for (int32_t i=0; i<m_num_plifs; i++)
74  {
75  int32_t id=get_plif_id(i);
76  m_PEN[id]->set_max_value(max_values.vector[i]);
77  }
78 }
79 
81 {
82  if (use_cache.vlen!=m_num_plifs)
83  SG_ERROR("plif_values size mismatch (num_values=%d vs.num_plifs=%d)\n", use_cache.vlen, m_num_plifs)
84 
85  for (int32_t i=0; i<m_num_plifs; i++)
86  {
87  int32_t id=get_plif_id(i);
88  m_PEN[id]->set_use_cache(use_cache.vector[i]);
89  }
90 }
91 
93 {
94  if (use_svm.vlen!=m_num_plifs)
95  SG_ERROR("plif_values size mismatch (num_values=%d vs.num_plifs=%d)\n", use_svm.vlen, m_num_plifs)
96 
97  for (int32_t i=0; i<m_num_plifs; i++)
98  {
99  int32_t id=get_plif_id(i);
100  m_PEN[id]->set_use_svm(use_svm.vector[i]);
101  }
102 }
103 
105 {
106  if (limits.num_rows!=m_num_plifs || limits.num_cols!=m_num_limits)
107  {
108  SG_ERROR("limits size mismatch expected (%d,%d) got (%d,%d)\n",
109  m_num_plifs, m_num_limits, limits.num_rows, limits.num_cols);
110  }
111 
112  for (int32_t i=0; i<m_num_plifs; i++)
113  {
115  for (int32_t k=0; k<m_num_limits; k++)
116  lim[k] = limits.matrix[i*m_num_limits+k];
117 
118  int32_t id=get_plif_id(i);
119  m_PEN[id]->set_plif_limits(lim);
120  }
121 }
122 
124 {
125  if (penalties.num_rows!=m_num_plifs || penalties.num_cols!=m_num_limits)
126  {
127  SG_ERROR("penalties size mismatch expected (%d,%d) got (%d,%d)\n",
128  m_num_plifs, m_num_limits, penalties.num_rows, penalties.num_cols);
129  }
130 
131  for (int32_t i=0; i<m_num_plifs; i++)
132  {
134 
135  for (int32_t k=0; k<m_num_limits; k++)
136  pen[k] = penalties.matrix[i*m_num_limits+k];
137 
138  int32_t id=get_plif_id(i);
139  m_PEN[id]->set_plif_penalty(pen);
140  }
141 }
142 
143 void CPlifMatrix::set_plif_names(SGString<char>* names, int32_t num_values, int32_t maxlen)
144 {
145  if (num_values!=m_num_plifs)
146  SG_ERROR("names size mismatch (num_values=%d vs.num_plifs=%d)\n", num_values, m_num_plifs)
147 
148  for (int32_t i=0; i<m_num_plifs; i++)
149  {
150  int32_t id=get_plif_id(i);
152  m_PEN[id]->set_plif_name(name);
153  SG_FREE(name);
154  }
155 }
156 
157 void CPlifMatrix::set_plif_transform_type(SGString<char>* transform_type, int32_t num_values, int32_t maxlen)
158 {
159  if (num_values!=m_num_plifs)
160  SG_ERROR("transform_type size mismatch (num_values=%d vs.num_plifs=%d)\n", num_values, m_num_plifs)
161 
162  for (int32_t i=0; i<m_num_plifs; i++)
163  {
164  int32_t id=get_plif_id(i);
165  char* transform_str=CStringFeatures<char>::get_zero_terminated_string_copy(transform_type[i]);
166 
167  if (!m_PEN[id]->set_transform_type(transform_str))
168  {
169  SG_FREE(m_PEN);
170  m_PEN=NULL;
171  m_num_plifs=0;
172  m_num_limits=0;
173  SG_ERROR("transform type not recognized ('%s')\n", transform_str)
174  }
175  SG_FREE(transform_str);
176  }
177 }
178 
179 
181 {
182  CPlif** PEN = get_PEN();
183  int32_t num_states = penalties_array.dims[0];
184  int32_t num_plifs = get_num_plifs();
185 
186  for (int32_t i=0; i<m_num_states*m_num_states; i++)
187  delete m_plif_matrix[i];
188  SG_FREE(m_plif_matrix);
189 
190  m_num_states = num_states;
191  m_plif_matrix = SG_MALLOC(CPlifBase*, num_states*num_states);
192 
193  CDynamicArray<float64_t> penalties(penalties_array.array, num_states, num_states, penalties_array.dims[2], true, true) ;
194 
195  for (int32_t i=0; i<num_states; i++)
196  {
197  for (int32_t j=0; j<num_states; j++)
198  {
199  CPlifArray * plif_array = NULL;
200  CPlif * plif = NULL ;
201  for (int32_t k=0; k<penalties_array.dims[2]; k++)
202  {
203  if (penalties.element(i,j,k)==0)
204  continue ;
205 
206  if (!plif_array)
207  {
208  plif_array = new CPlifArray() ;
209  plif_array->clear() ;
210  }
211 
212  int32_t id = (int32_t) penalties.element(i,j,k)-1 ;
213 
214  if ((id<0 || id>=num_plifs) && (id!=-1))
215  {
216  SG_ERROR("id out of range\n")
217  CPlif::delete_penalty_struct(PEN, num_plifs) ;
218  return false ;
219  }
220  plif = PEN[id] ;
221 
222  plif_array->add_plif(plif) ;
223  }
224 
225  if (!plif_array)
226  {
227  m_plif_matrix[i+j*num_states] = NULL ;
228  }
229  else if (plif_array->get_num_plifs()==1)
230  {
231  SG_UNREF(plif_array);
232  ASSERT(plif!=NULL)
233  m_plif_matrix[i+j*num_states] = plif ;
234  }
235  else
236  m_plif_matrix[i+j*num_states] = plif_array ;
237 
238  }
239  }
240  return true;
241 }
242 
244 {
245  int32_t Nplif = get_num_plifs();
246  CPlif** PEN = get_PEN();
247 
248  SG_FREE(m_state_signals);
249  m_feat_dim3 = state_signals.num_rows;
250 
251  CPlifBase **PEN_state_signal = SG_MALLOC(CPlifBase*, state_signals.num_rows*state_signals.num_cols);
252  for (int32_t i=0; i<state_signals.num_cols*state_signals.num_rows; i++)
253  {
254  int32_t id = (int32_t) state_signals.matrix[i]-1 ;
255  if ((id<0 || id>=Nplif) && (id!=-1))
256  {
257  SG_ERROR("id out of range\n")
258  CPlif::delete_penalty_struct(PEN, Nplif) ;
259  return false ;
260  }
261  if (id==-1)
262  PEN_state_signal[i]=NULL ;
263  else
264  PEN_state_signal[i]=PEN[id] ;
265  }
266  m_state_signals=PEN_state_signal;
267  return true;
268 }
269 
271  int32_t *plif_id_matrix, int32_t m, int32_t max_num_signals)
272 {
273  if (m!=m_num_plifs)
274  SG_ERROR("plif_state_signal_matrix size does not match previous info %i!=%i\n", m, m_num_plifs)
275 
276  /*if (m_seq.get_dim3() != max_num_signals)
277  SG_ERROR("size(plif_state_signal_matrix,2) does not match with size(m_seq,3): %i!=%i\nSorry, Soeren... interface changed\n", m_seq.get_dim3(), max_num_signals)
278 
279  CArray2<int32_t> id_matrix(plif_id_matrix, m_num_plifs, max_num_signals, false, false) ;
280  m_PEN_state_signals.resize_array(m_num_plifs, max_num_signals) ;
281  for (int32_t i=0; i<m_num_plifs; i++)
282  {
283  for (int32_t j=0; j<max_num_signals; j++)
284  {
285  if (id_matrix.element(i,j)>=0)
286  m_PEN_state_signals.element(i,j)=m_plif_list[id_matrix.element(i,j)] ;
287  else
288  m_PEN_state_signals.element(i,j)=NULL ;
289  }
290  }*/
291 }

SHOGUN Machine Learning Toolbox - Documentation