- for(int k = 1; k <= _nb_clusters; k++) {
- for(int c = 1; c <= nb_classes; c++) {
- int row = nb_points + (k - 1) * nb_classes + c;
- for(int n = 1; n <= nb_points; n++) {
- if(labels[n-1] == c - 1) {
- ia[l] = row;
- ja[l] = (k-1) * nb_points + n;
- ar[l] = 1.0;
- l++;
+ if(absolute_proportion) {
+ for(int k = 1; k <= _nb_clusters; k++) {
+ for(int c = 1; c <= nb_classes; c++) {
+ int row = nb_points + (k - 1) * nb_classes + c;
+ scalar_t tau = nb_samples_per_class[c-1] / scalar_t(_nb_clusters);
+ glp_set_row_bnds(lp, row, GLP_FX, tau, tau);
+ for(int n = 1; n <= nb_points; n++) {
+ if(labels[n-1] == c - 1) {
+ coeff_row[n_coeff] = row;
+ coeff_col[n_coeff] = (k-1) * nb_points + n;
+ coeff_wgt[n_coeff] = 1.0;
+ n_coeff++;
+ }
+ }
+ }
+ }
+ } else {
+ for(int k = 1; k <= _nb_clusters; k++) {
+ for(int c = 1; c <= nb_classes; c++) {
+ int row = nb_points + (k - 1) * nb_classes + c;
+ glp_set_row_bnds(lp, row, GLP_FX, 0.0, 0.0);
+ for(int n = 1; n <= nb_points; n++) {
+ coeff_row[n_coeff] = row;
+ coeff_col[n_coeff] = (k-1) * nb_points + n;
+ coeff_wgt[n_coeff] =
+ (labels[n-1] == c - 1 ? 1.0 : 0.0)
+ - scalar_t(nb_samples_per_class[c-1]) / scalar_t(nb_points);
+ n_coeff++;