SHOGUN  v1.1.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros 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 
23 
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 
113  for (int32_t i=0; i<m_num_plifs; i++)
114  {
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(SGVector<float64_t>(lim, m_num_limits));
120  }
121  SG_FREE(lim);
122 }
123 
125 {
126  if (penalties.num_rows!=m_num_plifs || penalties.num_cols!=m_num_limits)
127  {
128  SG_ERROR("penalties size mismatch expected (%d,%d) got (%d,%d)\n",
129  m_num_plifs, m_num_limits, penalties.num_rows, penalties.num_cols);
130  }
131 
133  for (int32_t i=0; i<m_num_plifs; i++)
134  {
135 
136  for (int32_t k=0; k<m_num_limits; k++)
137  pen[k] = penalties.matrix[i*m_num_limits+k];
138 
139  int32_t id=get_plif_id(i);
140  m_PEN[id]->set_plif_penalty(SGVector<float64_t>(pen, m_num_limits));
141  }
142  SG_FREE(pen);
143 }
144 
145 void CPlifMatrix::set_plif_names(SGString<char>* names, int32_t num_values, int32_t maxlen)
146 {
147  if (num_values!=m_num_plifs)
148  SG_ERROR("names size mismatch (num_values=%d vs.num_plifs=%d)\n", num_values, m_num_plifs);
149 
150  for (int32_t i=0; i<m_num_plifs; i++)
151  {
152  int32_t id=get_plif_id(i);
154  m_PEN[id]->set_plif_name(name);
155  SG_FREE(name);
156  }
157 }
158 
159 void CPlifMatrix::set_plif_transform_type(SGString<char>* transform_type, int32_t num_values, int32_t maxlen)
160 {
161  if (num_values!=m_num_plifs)
162  SG_ERROR("transform_type size mismatch (num_values=%d vs.num_plifs=%d)\n", num_values, m_num_plifs);
163 
164  for (int32_t i=0; i<m_num_plifs; i++)
165  {
166  int32_t id=get_plif_id(i);
167  char* transform_str=CStringFeatures<char>::get_zero_terminated_string_copy(transform_type[i]);
168 
169  if (!m_PEN[id]->set_transform_type(transform_str))
170  {
171  SG_FREE(m_PEN);
172  m_PEN=NULL;
173  m_num_plifs=0;
174  m_num_limits=0;
175  SG_ERROR( "transform type not recognized ('%s')\n", transform_str) ;
176  }
177  SG_FREE(transform_str);
178  }
179 }
180 
181 
183 {
184  CPlif** PEN = get_PEN();
185  int32_t num_states = penalties_array.dims[0];
186  int32_t num_plifs = get_num_plifs();
187 
188  for (int32_t i=0; i<m_num_states*m_num_states; i++)
189  delete m_plif_matrix[i];
191 
192  m_num_states = num_states;
193  m_plif_matrix = SG_MALLOC(CPlifBase*, num_states*num_states);
194 
195  CArray3<float64_t> penalties(penalties_array.array, num_states, num_states, penalties_array.dims[2], true, true) ;
196 
197  for (int32_t i=0; i<num_states; i++)
198  {
199  for (int32_t j=0; j<num_states; j++)
200  {
201  CPlifArray * plif_array = NULL;
202  CPlif * plif = NULL ;
203  for (int32_t k=0; k<penalties_array.dims[2]; k++)
204  {
205  if (penalties.element(i,j,k)==0)
206  continue ;
207 
208  if (!plif_array)
209  {
210  plif_array = new CPlifArray() ;
211  plif_array->clear() ;
212  }
213 
214  int32_t id = (int32_t) penalties.element(i,j,k)-1 ;
215 
216  if ((id<0 || id>=num_plifs) && (id!=-1))
217  {
218  SG_ERROR( "id out of range\n") ;
219  CPlif::delete_penalty_struct(PEN, num_plifs) ;
220  return false ;
221  }
222  plif = PEN[id] ;
223 
224  plif_array->add_plif(plif) ;
225  }
226 
227  if (!plif_array)
228  {
229  m_plif_matrix[i+j*num_states] = NULL ;
230  }
231  else if (plif_array->get_num_plifs()==1)
232  {
233  SG_UNREF(plif_array);
234  ASSERT(plif!=NULL) ;
235  m_plif_matrix[i+j*num_states] = plif ;
236  }
237  else
238  m_plif_matrix[i+j*num_states] = plif_array ;
239 
240  }
241  }
242  return true;
243 }
244 
246 {
247  int32_t Nplif = get_num_plifs();
248  CPlif** PEN = get_PEN();
249 
251  m_feat_dim3 = state_signals.num_rows;
252 
253  CPlifBase **PEN_state_signal = SG_MALLOC(CPlifBase*, state_signals.num_rows*state_signals.num_cols);
254  for (int32_t i=0; i<state_signals.num_cols*state_signals.num_rows; i++)
255  {
256  int32_t id = (int32_t) state_signals.matrix[i]-1 ;
257  if ((id<0 || id>=Nplif) && (id!=-1))
258  {
259  SG_ERROR( "id out of range\n") ;
260  CPlif::delete_penalty_struct(PEN, Nplif) ;
261  return false ;
262  }
263  if (id==-1)
264  PEN_state_signal[i]=NULL ;
265  else
266  PEN_state_signal[i]=PEN[id] ;
267  }
268  m_state_signals=PEN_state_signal;
269  return true;
270 }
271 
273  int32_t *plif_id_matrix, int32_t m, int32_t max_num_signals)
274 {
275  if (m!=m_num_plifs)
276  SG_ERROR( "plif_state_signal_matrix size does not match previous info %i!=%i\n", m, m_num_plifs) ;
277 
278  /*if (m_seq.get_dim3() != max_num_signals)
279  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) ;
280 
281  CArray2<int32_t> id_matrix(plif_id_matrix, m_num_plifs, max_num_signals, false, false) ;
282  m_PEN_state_signals.resize_array(m_num_plifs, max_num_signals) ;
283  for (int32_t i=0; i<m_num_plifs; i++)
284  {
285  for (int32_t j=0; j<max_num_signals; j++)
286  {
287  if (id_matrix.element(i,j)>=0)
288  m_PEN_state_signals.element(i,j)=m_plif_list[id_matrix.element(i,j)] ;
289  else
290  m_PEN_state_signals.element(i,j)=NULL ;
291  }
292  }*/
293 }
CArray< int32_t > m_ids
Definition: PlifMatrix.h:209
void set_plif_penalty(SGVector< float64_t > p_penalties)
Definition: Plif.h:270
CPlifBase ** m_state_signals
Definition: PlifMatrix.h:215
void set_max_value(float64_t p_max_value)
Definition: Plif.h:331
void set_plif_name(char *p_name)
Definition: Plif.cpp:100
void set_plif_transform_type(SGString< char > *transform_type, int32_t num_values, int32_t maxlen=0)
Definition: PlifMatrix.cpp:159
#define SG_ERROR(...)
Definition: SGIO.h:75
void set_plif_use_cache(SGVector< bool > use_cache)
Definition: PlifMatrix.cpp:80
int32_t get_num_plifs()
Definition: PlifArray.h:43
void set_plif_limits(SGVector< float64_t > p_limits)
Definition: Plif.h:254
class Plif
Definition: Plif.h:37
void set_plif_state_signal_matrix(int32_t *plif_id_matrix, int32_t m, int32_t n)
Definition: PlifMatrix.cpp:272
const T & element(int32_t idx1, int32_t idx2, int32_t idx3) const
Definition: Array3.h:209
bool compute_plif_matrix(SGNDArray< float64_t > penalties_array)
Definition: PlifMatrix.cpp:182
bool resize_array(int32_t n)
Definition: Array.h:253
#define ASSERT(x)
Definition: SGIO.h:102
void set_use_cache(int32_t p_use_cache)
Definition: Plif.h:206
void set_plif_penalties(SGMatrix< float64_t > penalties)
Definition: PlifMatrix.cpp:124
void set_plif_limits(SGMatrix< float64_t > limits)
Definition: PlifMatrix.cpp:104
double float64_t
Definition: common.h:56
index_t num_rows
Definition: DataType.h:366
void add_plif(CPlifBase *new_plif)
Definition: PlifArray.cpp:36
void set_plif_min_values(SGVector< float64_t > min_values)
Definition: PlifMatrix.cpp:56
index_t num_cols
Definition: DataType.h:368
class PlifBase
Definition: PlifBase.h:21
#define SG_FREE(ptr)
Definition: memory.h:39
void set_plif_ids(SGVector< int32_t > ids)
Definition: PlifMatrix.cpp:41
void set_plif_use_svm(SGVector< int32_t > use_svm)
Definition: PlifMatrix.cpp:92
int32_t get_plif_id(int32_t idx)
Definition: PlifMatrix.h:153
void set_id(int32_t p_id)
Definition: Plif.h:151
int32_t get_num_plifs()
Definition: PlifMatrix.h:71
#define SG_UNREF(x)
Definition: SGObject.h:45
void set_array(T *p_array, int32_t p_array_size, bool p_free_array=true, bool copy_array=false)
Definition: Array.h:285
index_t * dims
Definition: DataType.h:392
void set_plif_max_values(SGVector< float64_t > max_values)
Definition: PlifMatrix.cpp:68
void set_use_svm(int32_t p_use_svm)
Definition: Plif.h:178
void set_plif_names(SGString< char > *names, int32_t num_values, int32_t maxlen=0)
Definition: PlifMatrix.cpp:145
bool compute_signal_plifs(SGMatrix< int32_t > state_signals)
Definition: PlifMatrix.cpp:245
CPlif ** get_PEN()
Definition: PlifMatrix.h:45
void set_min_value(float64_t p_min_value)
Definition: Plif.h:350
static ST * get_zero_terminated_string_copy(SGString< ST > str)
CPlifBase ** m_plif_matrix
Definition: PlifMatrix.h:212
shogun n-dimensional array
Definition: DataType.h:374
class PlifArray
Definition: PlifArray.h:23
#define SG_MALLOC(type, len)
Definition: memory.h:36
static void delete_penalty_struct(CPlif **PEN, int32_t P)
Definition: Plif.cpp:107
void create_plifs(int32_t num_plifs, int32_t num_limits)
Definition: PlifMatrix.cpp:27
index_t vlen
Definition: DataType.h:248

SHOGUN Machine Learning Toolbox - Documentation