glpmps01.c

来自「著名的大规模线性规划求解器源码GLPK.C语言版本,可以修剪.内有详细帮助文档.」· C语言 代码 · 共 1,469 行 · 第 1/4 页

C
1,469
字号
      }      if (dsa->f4[0] == '\0')      {  xprintf("%s:%d: missing coefficient value in field 4\n",            dsa->fname, dsa->count);         goto fail;      }      if (str2num(dsa->f4, &temp))      {  xprintf("%s:%d: invalid coefficient value in field 4\n",            dsa->fname, dsa->count);         goto fail;      }      if (map[i])      {  xprintf("%s:%d: coefficient in row %s multiply specified\n",            dsa->fname, dsa->count, dsa->f3);         goto fail;      }      map[i] = 1, len++, ind[len] = i, aij[len] = temp;      /* scan optional row name and coefficient in fields 5 and 6 */      if (dsa->f5[0] == '\0' && dsa->f6[0] == '\0') goto loop;      if (dsa->f5[0] == '\0')      {  xprintf("%s:%d: missing row name in field 5\n", dsa->fname,            dsa->count);         goto fail;      }      i = lpx_find_row(dsa->lp, dsa->f5);      if (i == 0)      {  xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count,            dsa->f5);         goto fail;      }      if (dsa->f6[0] == '\0')      {  xprintf("%s:%d: missing coefficient value in field 6\n",            dsa->fname, dsa->count);         goto fail;      }      if (str2num(dsa->f6, &temp))      {  xprintf("%s:%d: invalid coefficient value in field 6\n",            dsa->fname, dsa->count);         goto fail;      }      if (map[i])      {  xprintf("%s:%d: coefficient in row %s multiply specified\n",            dsa->fname, dsa->count, dsa->f5);         goto fail;      }      map[i] = 1, len++, ind[len] = i, aij[len] = temp;      goto loop;done: /* finish the last column */      if (j != 0) put_column(dsa, j, len, ind, aij);      xfree(map), xfree(ind), xfree(aij);      return 0;fail: xfree(map), xfree(ind), xfree(aij);      return 1;}static void set_rhs(struct dsa *dsa, int i, double b){     /* set right-hand side for i-th row */      switch (lpx_get_row_type(dsa->lp, i))      {  case LPX_FR:            if (dsa->obj == i)               lpx_set_obj_coef(dsa->lp, 0, b);            else if (b != 0.0)               xprintf("%s:%d: warning: non-zero rhs for free row %s ig"                  "nored\n", dsa->fname, dsa->count,                  lpx_get_row_name(dsa->lp, i));            break;         case LPX_LO:            lpx_set_row_bnds(dsa->lp, i, LPX_LO, b, 0.0);            break;         case LPX_UP:            lpx_set_row_bnds(dsa->lp, i, LPX_UP, 0.0, b);            break;         case LPX_FX:            lpx_set_row_bnds(dsa->lp, i, LPX_FX, b, b);            break;         default:            xassert(dsa != dsa);      }      return;}static int read_rhs(struct dsa *dsa){     /* process data cards in RHS section */      int i, m, *map;      double temp;      char name[8+1] = "\n";      /* allocate working array */      m = lpx_get_num_rows(dsa->lp);      map = xcalloc(1+m, sizeof(int));      for (i = 1; i <= m; i++) map[i] = 0;loop: /* read and split next data card */      if (read_card(dsa)) goto fail;      if (dsa->card[0] != ' ') goto done;      if (split_card(dsa)) goto fail;      /* field 1 must be blank */      if (dsa->f1[0] != '\0')      {  xprintf("%s:%d: invalid data card; field 1 must be blank\n",            dsa->fname, dsa->count);         goto fail;      }      /* scan optional rhs vector name in field 2 */      if (name[0] == '\n') strcpy(name, dsa->f2);      if (!(dsa->f2[0] == '\0' || strcmp(dsa->f2, name) == 0))      {  xprintf("%s:%d: at most one rhs vector allowed\n", dsa->fname,            dsa->count);         goto fail;      }      /* scan row name and rhs value in fields 3 and 4 */      if (dsa->f3[0] == '\0')      {  xprintf("%s:%d: missing row name in field 3\n", dsa->fname,            dsa->count);         goto fail;      }      i = lpx_find_row(dsa->lp, dsa->f3);      if (i == 0)      {  xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count,            dsa->f3);         goto fail;      }      if (dsa->f4[0] == '\0')      {  xprintf("%s:%d: missing rhs value in field 4\n", dsa->fname,            dsa->count);         goto fail;      }      if (str2num(dsa->f4, &temp))      {  xprintf("%s:%d: invalid rhs value in field 4\n", dsa->fname,            dsa->count);         goto fail;      }      if (map[i])      {  xprintf("%s:%d: rhs for row %s multiply specified\n",            dsa->fname, dsa->count, dsa->f3);         goto fail;      }      set_rhs(dsa, i, temp), map[i] = 1;      /* scan optional row name and rhs value in fields 5 and 6 */      if (dsa->f5[0] == '\0' && dsa->f6[0] == '\0') goto loop;      if (dsa->f5[0] == '\0')      {  xprintf("%s:%d: missing row name in field 5\n", dsa->fname,            dsa->count);         goto fail;      }      i = lpx_find_row(dsa->lp, dsa->f5);      if (i == 0)      {  xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count,            dsa->f5);         goto fail;      }      if (dsa->f6[0] == '\0')      {  xprintf("%s:%d: missing rhs value in field 6\n", dsa->fname,            dsa->count);         goto fail;      }      if (str2num(dsa->f6, &temp))      {  xprintf("%s:%d: invalid rhs value in field 6\n", dsa->fname,            dsa->count);         goto fail;      }      if (map[i])      {  xprintf("%s:%d: rhs for row %s multiply specified\n",            dsa->fname, dsa->count, dsa->f5);         goto fail;      }      set_rhs(dsa, i, temp), map[i] = 1;      goto loop;done: xfree(map);      return 0;fail: xfree(map);      return 1;}static void set_range(struct dsa *dsa, int i, double r){     /* set range value for i-th row */      double b;      switch (lpx_get_row_type(dsa->lp, i))      {  case LPX_FR:            xprintf("%s:%d: warning: range value for free row %s ignore"               "d\n", dsa->fname, dsa->count,               lpx_get_row_name(dsa->lp, i));            break;         case LPX_LO:            b = lpx_get_row_lb(dsa->lp, i);            if (r == 0.0)               lpx_set_row_bnds(dsa->lp, i, LPX_FX, b, b);            else               lpx_set_row_bnds(dsa->lp, i, LPX_DB, b, b + fabs(r));            break;         case LPX_UP:            b = lpx_get_row_ub(dsa->lp, i);            if (r == 0.0)               lpx_set_row_bnds(dsa->lp, i, LPX_FX, b, b);            else               lpx_set_row_bnds(dsa->lp, i, LPX_DB, b - fabs(r), b);            break;         case LPX_FX:            b = lpx_get_row_lb(dsa->lp, i);            if (r > 0.0)               lpx_set_row_bnds(dsa->lp, i, LPX_DB, b, b + fabs(r));            else if (r < 0.0)               lpx_set_row_bnds(dsa->lp, i, LPX_DB, b - fabs(r), b);            break;         default:            xassert(dsa != dsa);      }      return;}static int read_ranges(struct dsa *dsa){     /* process data cards in RANGES section */      int i, m, *map;      double temp;      char name[8+1] = "\n";      /* allocate working array */      m = lpx_get_num_rows(dsa->lp);      map = xcalloc(1+m, sizeof(int));      for (i = 1; i <= m; i++) map[i] = 0;loop: /* read and split next data card */      if (read_card(dsa)) goto fail;      if (dsa->card[0] != ' ') goto done;      if (split_card(dsa)) goto fail;      /* field 1 must be blank */      if (dsa->f1[0] != '\0')      {  xprintf("%s:%d: invalid data card; field 1 must be blank\n",            dsa->fname, dsa->count);         goto fail;      }      /* scan optional ranges vector name in field 2 */      if (name[0] == '\n') strcpy(name, dsa->f2);      if (!(dsa->f2[0] == '\0' || strcmp(dsa->f2, name) == 0))      {  xprintf("%s:%d: at most one ranges vector allowed\n",            dsa->fname, dsa->count);         goto fail;      }      /* scan row name and range value in fields 3 and 4 */      if (dsa->f3[0] == '\0')      {  xprintf("%s:%d: missing row name in field 3\n", dsa->fname,            dsa->count);         goto fail;      }      i = lpx_find_row(dsa->lp, dsa->f3);      if (i == 0)      {  xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count,            dsa->f3);         goto fail;      }      if (dsa->f4[0] == '\0')      {  xprintf("%s:%d: missing range value in field 4\n", dsa->fname,            dsa->count);         goto fail;      }      if (str2num(dsa->f4, &temp))      {  xprintf("%s:%d: invalid range value in field 4\n", dsa->fname,            dsa->count);         goto fail;      }      if (map[i])      {  xprintf("%s:%d: range for row %s multiply specified\n",            dsa->fname, dsa->count, dsa->f3);         goto fail;      }      set_range(dsa, i, temp), map[i] = 1;      /* scan optional row name and range value in fields 5 and 6 */      if (dsa->f5[0] == '\0' && dsa->f6[0] == '\0') goto loop;      if (dsa->f5[0] == '\0')      {  xprintf("%s:%d: missing row name in field 5\n", dsa->fname,            dsa->count);         goto fail;      }      i = lpx_find_row(dsa->lp, dsa->f5);      if (i == 0)      {  xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count,            dsa->f5);         goto fail;      }      if (dsa->f6[0] == '\0')      {  xprintf("%s:%d: missing range value in field 6\n", dsa->fname,            dsa->count);         goto fail;      }      if (str2num(dsa->f6, &temp))      {  xprintf("%s:%d: invalid range value in field 6\n", dsa->fname,            dsa->count);         goto fail;      }      if (map[i])      {  xprintf("%s:%d: range for row %s multiply specified\n",            dsa->fname, dsa->count, dsa->f5);         goto fail;      }      set_range(dsa, i, temp), map[i] = 1;      goto loop;done: xfree(map);      return 0;fail: xfree(map);      return 1;}static int read_bounds(struct dsa *dsa){     /* process data cards in BOUNDS section */      int j, type;      double lb, ub, temp;      char name[8+1] = "\n";loop: /* read and split next data card */      if (read_card(dsa)) goto fail;      if (dsa->card[0] != ' ') goto done;      if (split_card(dsa)) goto fail;      /* scan bound type in field 1 */      if (dsa->f1[0] == '\0')      {  xprintf("%s:%d: missing bound type in field 1\n", dsa->fname,            dsa->count);         goto fail;      }      /* scan optional bounds vector name in field 2 */      if (name[0] == '\n') strcpy(name, dsa->f2);      if (!(dsa->f2[0] == '\0' || strcmp(dsa->f2, name) == 0))      {  xprintf("%s:%d: at most one bounds vector allowed\n",            dsa->fname, dsa->count);         goto fail;      }      /* scan column name in field 3 */      if (dsa->f3[0] == '\0')      {  xprintf("%s:%d: missing column name in field 3\n", dsa->fname,            dsa->count);         goto fail;      }      j = lpx_find_col(dsa->lp, dsa->f3);      if (j == 0)      {  xprintf("%s:%d: column %s not found\n", dsa->fname, dsa->count,            dsa->f3);         goto fail;      }      /* scan optional bound value in field 4 */      if (!(strcmp(dsa->f1, "LO") == 0 || strcmp(dsa->f1, "UP") == 0 ||            strcmp(dsa->f1, "FX") == 0 || strcmp(dsa->f1, "LI") == 0 ||            strcmp(dsa->f1, "UI") == 0))         goto skip;      if (dsa->f4[0] == '\0')      {  xprintf("%s:%d: missing bound value in field 4\n", dsa->fname,            dsa->count);         goto fail;      }      if (str2num(dsa->f4, &temp))      {  xprintf("%s:%d: invalid bound value in field 4\n", dsa->fname,            dsa->count);         goto fail;      }skip: /* change column bounds */      type = lpx_get_col_type(dsa->lp, j);      if (type == LPX_FR || type == LPX_UP)         lb = -DBL_MAX;      else         lb = lpx_get_col_lb(dsa->lp, j);      if (type == LPX_FR || type == LPX_LO)         ub = +DBL_MAX;      else         ub = lpx_get_col_ub(dsa->lp, j);      if (strcmp(dsa->f1, "LO") == 0)         lb = temp;      else if (strcmp(dsa->f1, "UP") == 0)         ub = temp;      else if (strcmp(dsa->f1, "FX") == 0)         lb = ub = temp;      else if (strcmp(dsa->f1, "FR") == 0)         lb = -DBL_MAX, ub = +DBL_MAX;      else if (strcmp(dsa->f1, "MI") == 0)         lb = -DBL_MAX;      else if (strcmp(dsa->f1, "PL") == 0)         ub = +DBL_MAX;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?