34 using namespace shogun;
53 init(num_labels, num_classes);
64 CMultilabelLabels::init(int32_t num_labels, int16_t num_classes)
66 REQUIRE(num_labels >= 0,
"num_labels=%d should be >= 0", num_labels);
67 REQUIRE(num_classes > 0,
"num_classes=%d should be > 0", num_classes);
99 SG_PRINT(
"m_labels[label_j=%d] not sorted: ", label_j);
104 "labels[%d] are not sorted!", label_j);
113 "first label labels[%d]=%d should be >= 0!",
114 label_j,
m_labels[label_j].vector[0]);
116 "last label labels[%d]=%d should be < num_classes == %d!",
139 for (int32_t label_j = 0; label_j <
m_num_labels; label_j++)
141 m_labels[label_j] = labels[label_j];
151 int32_t * num_label_idx =
156 num_label_idx[class_i] = 0;
161 for (int32_t c_pos = 0; c_pos <
m_labels[label_j].
vlen; c_pos++)
163 int16_t class_i =
m_labels[label_j][c_pos];
165 "class_i exceeded number of classes");
166 num_label_idx[class_i]++;
172 labels_list[class_i] =
175 SG_FREE(num_label_idx);
180 next_label_idx[class_i] = 0;
185 for (int32_t c_pos = 0; c_pos <
m_labels[label_j].
vlen; c_pos++)
188 int16_t class_i =
m_labels[label_j][c_pos];
190 "class_i exceeded number of classes");
192 int32_t l_pos = next_label_idx[class_i];
193 REQUIRE(l_pos < labels_list[class_i]->size(),
194 "l_pos exceeded length of label list");
195 next_label_idx[class_i]++;
197 (*labels_list[class_i])[l_pos] = label_j;
201 SG_FREE(next_label_idx);
209 "label index j=%d should be within [%d,%d[",
215 template <
class S,
class D>
221 for (int32_t i = 0; i < sparse->
vlen; i++)
223 S index = (*sparse)[i];
225 "class index exceeded length of dense vector");
226 dense[index] = d_true;
248 "label index j=%d should be within [%d,%d[",
260 num_class_idx[label_j] = 0;
265 for (int32_t l_pos = 0; l_pos < labels_list[class_i]->
vlen; l_pos++)
267 int32_t label_j = (*labels_list[class_i])[l_pos];
269 "class_i=%d/%d :: label_j=%d/%d (l_pos=%d)\n",
272 num_class_idx[label_j]++;
280 SG_FREE(num_class_idx);
285 next_class_idx[label_j] = 0;
290 for (int32_t l_pos = 0; l_pos < labels_list[class_i]->
vlen; l_pos++)
293 int32_t label_j = (*labels_list[class_i])[l_pos];
295 "class_i=%d/%d :: label_j=%d/%d (l_pos=%d)\n",
300 int32_t c_pos = next_class_idx[label_j];
302 "c_pos exceeded length of labels vector");
303 next_class_idx[label_j]++;
309 SG_FREE(next_class_idx);
319 SG_PRINT(
"printing %d binary label vectors for %d multilabels:\n",
324 SG_PRINT(
" yC_{class_i=%d}", class_i);
326 to_dense <int32_t, float64_t> (labels_list[class_i],
329 delete labels_list[class_i];
331 SG_FREE(labels_list);
333 SG_PRINT(
"printing %d binary class vectors for %d labels:\n",