00001 #include <shogun/structure/PlifMatrix.h>
00002 #include <shogun/structure/Plif.h>
00003 #include <shogun/structure/PlifArray.h>
00004 #include <shogun/structure/PlifBase.h>
00005
00006 using namespace shogun;
00007
00008 CPlifMatrix::CPlifMatrix() : m_PEN(NULL), m_num_plifs(0), m_num_limits(0),
00009 m_num_states(0), m_feat_dim3(0), m_plif_matrix(NULL), m_state_signals(NULL)
00010 {
00011 }
00012
00013 CPlifMatrix::~CPlifMatrix()
00014 {
00015 for (int32_t i=0; i<m_num_plifs; i++)
00016 delete m_PEN[i];
00017 SG_FREE(m_PEN);
00018
00019 for (int32_t i=0; i<m_num_states*m_num_states; i++)
00020 delete m_plif_matrix[i];
00021
00022 SG_FREE(m_plif_matrix);
00023
00024 SG_FREE(m_state_signals);
00025 }
00026
00027 void CPlifMatrix::create_plifs(int32_t num_plifs, int32_t num_limits)
00028 {
00029 for (int32_t i=0; i<m_num_plifs; i++)
00030 delete m_PEN[i];
00031 SG_FREE(m_PEN);
00032 m_PEN=NULL;
00033
00034 m_num_plifs=num_plifs;
00035 m_num_limits=num_limits;
00036 m_PEN = SG_MALLOC(CPlif*, num_plifs);
00037 for (int32_t i=0; i<num_plifs; i++)
00038 m_PEN[i]=new CPlif(num_limits) ;
00039 }
00040
00041 void CPlifMatrix::set_plif_ids(SGVector<int32_t> plif_ids)
00042 {
00043 if (plif_ids.vlen!=m_num_plifs)
00044 SG_ERROR("plif_ids size mismatch (num_ids=%d vs.num_plifs=%d)\n", plif_ids.vlen, m_num_plifs);
00045
00046 m_ids.resize_array(m_num_plifs);
00047 m_ids.set_array(plif_ids.vector, plif_ids.vlen, true, true);
00048
00049 for (int32_t i=0; i<m_num_plifs; i++)
00050 {
00051 int32_t id=get_plif_id(i);
00052 m_PEN[id]->set_id(id);
00053 }
00054 }
00055
00056 void CPlifMatrix::set_plif_min_values(SGVector<float64_t> min_values)
00057 {
00058 if (min_values.vlen!=m_num_plifs)
00059 SG_ERROR("plif_values size mismatch (num_values=%d vs.num_plifs=%d)\n", min_values.vlen, m_num_plifs);
00060
00061 for (int32_t i=0; i<m_num_plifs; i++)
00062 {
00063 int32_t id=get_plif_id(i);
00064 m_PEN[id]->set_min_value(min_values.vector[i]);
00065 }
00066 }
00067
00068 void CPlifMatrix::set_plif_max_values(SGVector<float64_t> max_values)
00069 {
00070 if (max_values.vlen!=m_num_plifs)
00071 SG_ERROR("plif_values size mismatch (num_values=%d vs.num_plifs=%d)\n", max_values.vlen, m_num_plifs);
00072
00073 for (int32_t i=0; i<m_num_plifs; i++)
00074 {
00075 int32_t id=get_plif_id(i);
00076 m_PEN[id]->set_max_value(max_values.vector[i]);
00077 }
00078 }
00079
00080 void CPlifMatrix::set_plif_use_cache(SGVector<bool> use_cache)
00081 {
00082 if (use_cache.vlen!=m_num_plifs)
00083 SG_ERROR("plif_values size mismatch (num_values=%d vs.num_plifs=%d)\n", use_cache.vlen, m_num_plifs);
00084
00085 for (int32_t i=0; i<m_num_plifs; i++)
00086 {
00087 int32_t id=get_plif_id(i);
00088 m_PEN[id]->set_use_cache(use_cache.vector[i]);
00089 }
00090 }
00091
00092 void CPlifMatrix::set_plif_use_svm(SGVector<int32_t> use_svm)
00093 {
00094 if (use_svm.vlen!=m_num_plifs)
00095 SG_ERROR("plif_values size mismatch (num_values=%d vs.num_plifs=%d)\n", use_svm.vlen, m_num_plifs);
00096
00097 for (int32_t i=0; i<m_num_plifs; i++)
00098 {
00099 int32_t id=get_plif_id(i);
00100 m_PEN[id]->set_use_svm(use_svm.vector[i]);
00101 }
00102 }
00103
00104 void CPlifMatrix::set_plif_limits(SGMatrix<float64_t> limits)
00105 {
00106 if (limits.num_rows!=m_num_plifs || limits.num_cols!=m_num_limits)
00107 {
00108 SG_ERROR("limits size mismatch expected (%d,%d) got (%d,%d)\n",
00109 m_num_plifs, m_num_limits, limits.num_rows, limits.num_cols);
00110 }
00111
00112 for (int32_t i=0; i<m_num_plifs; i++)
00113 {
00114 SGVector<float64_t> lim(m_num_limits);
00115 for (int32_t k=0; k<m_num_limits; k++)
00116 lim[k] = limits.matrix[i*m_num_limits+k];
00117
00118 int32_t id=get_plif_id(i);
00119 m_PEN[id]->set_plif_limits(lim);
00120 }
00121 }
00122
00123 void CPlifMatrix::set_plif_penalties(SGMatrix<float64_t> penalties)
00124 {
00125 if (penalties.num_rows!=m_num_plifs || penalties.num_cols!=m_num_limits)
00126 {
00127 SG_ERROR("penalties size mismatch expected (%d,%d) got (%d,%d)\n",
00128 m_num_plifs, m_num_limits, penalties.num_rows, penalties.num_cols);
00129 }
00130
00131 for (int32_t i=0; i<m_num_plifs; i++)
00132 {
00133 SGVector<float64_t> pen(m_num_limits);
00134
00135 for (int32_t k=0; k<m_num_limits; k++)
00136 pen[k] = penalties.matrix[i*m_num_limits+k];
00137
00138 int32_t id=get_plif_id(i);
00139 m_PEN[id]->set_plif_penalty(pen);
00140 }
00141 }
00142
00143 void CPlifMatrix::set_plif_names(SGString<char>* names, int32_t num_values, int32_t maxlen)
00144 {
00145 if (num_values!=m_num_plifs)
00146 SG_ERROR("names size mismatch (num_values=%d vs.num_plifs=%d)\n", num_values, m_num_plifs);
00147
00148 for (int32_t i=0; i<m_num_plifs; i++)
00149 {
00150 int32_t id=get_plif_id(i);
00151 char* name = CStringFeatures<char>::get_zero_terminated_string_copy(names[i]);
00152 m_PEN[id]->set_plif_name(name);
00153 SG_FREE(name);
00154 }
00155 }
00156
00157 void CPlifMatrix::set_plif_transform_type(SGString<char>* transform_type, int32_t num_values, int32_t maxlen)
00158 {
00159 if (num_values!=m_num_plifs)
00160 SG_ERROR("transform_type size mismatch (num_values=%d vs.num_plifs=%d)\n", num_values, m_num_plifs);
00161
00162 for (int32_t i=0; i<m_num_plifs; i++)
00163 {
00164 int32_t id=get_plif_id(i);
00165 char* transform_str=CStringFeatures<char>::get_zero_terminated_string_copy(transform_type[i]);
00166
00167 if (!m_PEN[id]->set_transform_type(transform_str))
00168 {
00169 SG_FREE(m_PEN);
00170 m_PEN=NULL;
00171 m_num_plifs=0;
00172 m_num_limits=0;
00173 SG_ERROR( "transform type not recognized ('%s')\n", transform_str) ;
00174 }
00175 SG_FREE(transform_str);
00176 }
00177 }
00178
00179
00180 bool CPlifMatrix::compute_plif_matrix(SGNDArray<float64_t> penalties_array)
00181 {
00182 CPlif** PEN = get_PEN();
00183 int32_t num_states = penalties_array.dims[0];
00184 int32_t num_plifs = get_num_plifs();
00185
00186 for (int32_t i=0; i<m_num_states*m_num_states; i++)
00187 delete m_plif_matrix[i];
00188 SG_FREE(m_plif_matrix);
00189
00190 m_num_states = num_states;
00191 m_plif_matrix = SG_MALLOC(CPlifBase*, num_states*num_states);
00192
00193 CDynamicArray<float64_t> penalties(penalties_array.array, num_states, num_states, penalties_array.dims[2], true, true) ;
00194
00195 for (int32_t i=0; i<num_states; i++)
00196 {
00197 for (int32_t j=0; j<num_states; j++)
00198 {
00199 CPlifArray * plif_array = NULL;
00200 CPlif * plif = NULL ;
00201 for (int32_t k=0; k<penalties_array.dims[2]; k++)
00202 {
00203 if (penalties.element(i,j,k)==0)
00204 continue ;
00205
00206 if (!plif_array)
00207 {
00208 plif_array = new CPlifArray() ;
00209 plif_array->clear() ;
00210 }
00211
00212 int32_t id = (int32_t) penalties.element(i,j,k)-1 ;
00213
00214 if ((id<0 || id>=num_plifs) && (id!=-1))
00215 {
00216 SG_ERROR( "id out of range\n") ;
00217 CPlif::delete_penalty_struct(PEN, num_plifs) ;
00218 return false ;
00219 }
00220 plif = PEN[id] ;
00221
00222 plif_array->add_plif(plif) ;
00223 }
00224
00225 if (!plif_array)
00226 {
00227 m_plif_matrix[i+j*num_states] = NULL ;
00228 }
00229 else if (plif_array->get_num_plifs()==1)
00230 {
00231 SG_UNREF(plif_array);
00232 ASSERT(plif!=NULL) ;
00233 m_plif_matrix[i+j*num_states] = plif ;
00234 }
00235 else
00236 m_plif_matrix[i+j*num_states] = plif_array ;
00237
00238 }
00239 }
00240 return true;
00241 }
00242
00243 bool CPlifMatrix::compute_signal_plifs(SGMatrix<int32_t> state_signals)
00244 {
00245 int32_t Nplif = get_num_plifs();
00246 CPlif** PEN = get_PEN();
00247
00248 SG_FREE(m_state_signals);
00249 m_feat_dim3 = state_signals.num_rows;
00250
00251 CPlifBase **PEN_state_signal = SG_MALLOC(CPlifBase*, state_signals.num_rows*state_signals.num_cols);
00252 for (int32_t i=0; i<state_signals.num_cols*state_signals.num_rows; i++)
00253 {
00254 int32_t id = (int32_t) state_signals.matrix[i]-1 ;
00255 if ((id<0 || id>=Nplif) && (id!=-1))
00256 {
00257 SG_ERROR( "id out of range\n") ;
00258 CPlif::delete_penalty_struct(PEN, Nplif) ;
00259 return false ;
00260 }
00261 if (id==-1)
00262 PEN_state_signal[i]=NULL ;
00263 else
00264 PEN_state_signal[i]=PEN[id] ;
00265 }
00266 m_state_signals=PEN_state_signal;
00267 return true;
00268 }
00269
00270 void CPlifMatrix::set_plif_state_signal_matrix(
00271 int32_t *plif_id_matrix, int32_t m, int32_t max_num_signals)
00272 {
00273 if (m!=m_num_plifs)
00274 SG_ERROR( "plif_state_signal_matrix size does not match previous info %i!=%i\n", m, m_num_plifs) ;
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291 }