⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glpmps02.c

📁 著名的大规模线性规划求解器源码GLPK.C语言版本,可以修剪.内有详细帮助文档.
💻 C
📖 第 1 页 / 共 3 页
字号:
      if (read_item(dsa)) goto fail;      if (dsa->item[0] == '\0')      {  xprintf("%s:%d: missing row name\n", dsa->fname, dsa->count);         goto fail;      }      /* find row */      i = lpx_find_row(dsa->lp, dsa->item);      if (i == 0)      {  xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count,            dsa->item);         goto fail;      }      /* scan rhs value */      if (read_item(dsa)) goto fail;      if (dsa->item[0] == '\0')      {  xprintf("%s:%d: missing rhs value\n", dsa->fname, dsa->count);         goto fail;      }      if (str2num(dsa->item, &temp))      {  xprintf("%s:%d: invalid rhs value\n", dsa->fname, dsa->count);         goto fail;      }      if (map[i])      {  xprintf("%s:%d: rhs for row %s multiply specified\n",            dsa->fname, dsa->count, lpx_get_row_name(dsa->lp, i));         goto fail;      }      set_rhs(dsa, i, temp), map[i] = 1;      /* there may be another row name and rhs value */      if (read_item(dsa)) goto fail;      if (dsa->item[0] == '\0') goto loop;      /* find row */      i = lpx_find_row(dsa->lp, dsa->item);      if (i == 0)      {  xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count,            dsa->item);         goto fail;      }      /* scan rhs value */      if (read_item(dsa)) goto fail;      if (dsa->item[0] == '\0')      {  xprintf("%s:%d: missing rhs value\n", dsa->fname, dsa->count);         goto fail;      }      if (str2num(dsa->item, &temp))      {  xprintf("%s:%d: invalid rhs value\n", dsa->fname, dsa->count);         goto fail;      }      if (map[i])      {  xprintf("%s:%d: rhs for row %s multiply specified\n",            dsa->fname, dsa->count, lpx_get_row_name(dsa->lp, i));         goto fail;      }      set_rhs(dsa, i, temp), map[i] = 1;      /* skip remaining characters */      while (dsa->c != '\n')         if (read_char(dsa)) goto fail;      if (read_item(dsa)) goto fail;      xassert(dsa->item[0] == '\0');      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 lines in RANGES section */      int i, m, *map;      double temp;      char name[sizeof(dsa->item)] = "";      /* 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: /* check if there is more data lines */      if (dsa->c != ' ') goto done;      /* scan range vector name */      if (read_item(dsa)) goto fail;      if (dsa->item[0] == '\0')      {  xprintf("%s:%d: missing range vector name\n",            dsa->fname, dsa->count);         goto fail;      }      if (name[0] == '\0') strcpy(name, dsa->item);      if (strcmp(dsa->item, name) != 0)      {  xprintf("%s:%d: at most one range vector allowed\n",            dsa->fname, dsa->count);         goto fail;      }      /* scan row name */      if (read_item(dsa)) goto fail;      if (dsa->item[0] == '\0')      {  xprintf("%s:%d: missing row name\n", dsa->fname, dsa->count);         goto fail;      }      /* find row */      i = lpx_find_row(dsa->lp, dsa->item);      if (i == 0)      {  xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count,            dsa->item);         goto fail;      }      /* scan range value */      if (read_item(dsa)) goto fail;      if (dsa->item[0] == '\0')      {  xprintf(            "%s:%d: missing range value\n", dsa->fname, dsa->count);         goto fail;      }      if (str2num(dsa->item, &temp))      {  xprintf(            "%s:%d: invalid range value\n", dsa->fname, dsa->count);         goto fail;      }      if (map[i])      {  xprintf("%s:%d: range for row %s multiply specified\n",            dsa->fname, dsa->count, lpx_get_row_name(dsa->lp, i));         goto fail;      }      set_range(dsa, i, temp), map[i] = 1;      /* there may be another row name and range value */      if (read_item(dsa)) goto fail;      if (dsa->item[0] == '\0') goto loop;      /* find row */      i = lpx_find_row(dsa->lp, dsa->item);      if (i == 0)      {  xprintf("%s:%d: row %s not found\n", dsa->fname, dsa->count,            dsa->item);         goto fail;      }      /* scan range value */      if (read_item(dsa)) goto fail;      if (dsa->item[0] == '\0')      {  xprintf(            "%s:%d: missing range value\n", dsa->fname, dsa->count);         goto fail;      }      if (str2num(dsa->item, &temp))      {  xprintf(            "%s:%d: invalid range value\n", dsa->fname, dsa->count);         goto fail;      }      if (map[i])      {  xprintf("%s:%d: range for row %s multiply specified\n",            dsa->fname, dsa->count, lpx_get_row_name(dsa->lp, i));         goto fail;      }      set_range(dsa, i, temp), map[i] = 1;      /* skip remaining characters */      while (dsa->c != '\n')         if (read_char(dsa)) goto fail;      if (read_item(dsa)) goto fail;      xassert(dsa->item[0] == '\0');      goto loop;done: xfree(map);      return 0;fail: xfree(map);      return 1;}static int read_bounds(struct dsa *dsa){     /* process data lines in BOUNDS section */      int j, type;      double lb, ub, temp;      char btyp[2+1];      char name[sizeof(dsa->item)] = "";loop: /* check if there is more data lines */      if (dsa->c != ' ') goto done;      /* scan bound type */      if (read_item(dsa)) goto fail;      if (dsa->item[0] == '\0')      {  xprintf(            "%s:%d: missing bound type\n", dsa->fname, dsa->count);         goto fail;      }      if (strlen(dsa->item) != 2)      {  xprintf(            "%s:%d: invalid bound type\n", dsa->fname, dsa->count);         goto fail;      }      strcpy(btyp, dsa->item);      /* scan bound vector name */      if (read_item(dsa)) goto fail;      if (dsa->item[0] == '\0')      {  xprintf("%s:%d: missing bound vector name\n", dsa->fname,            dsa->count);         goto fail;      }      if (name[0] == '\0') strcpy(name, dsa->item);      if (strcmp(dsa->item, name) != 0)      {  xprintf("%s:%d: at most one bound vector allowed\n",            dsa->fname, dsa->count);         goto fail;      }      /* scan column name */      if (read_item(dsa)) goto fail;      if (dsa->item[0] == '\0')      {  xprintf(            "%s:%d: missing column name\n", dsa->fname, dsa->count);         goto fail;      }      /* find column */      j = lpx_find_col(dsa->lp, dsa->item);      if (j == 0)      {  xprintf("%s:%d: column %s not found\n",            dsa->fname, dsa->count, dsa->item);         goto fail;      }      /* scan optional bound value */      if (!(strcmp(btyp, "LO") == 0 || strcmp(btyp, "UP") == 0 ||            strcmp(btyp, "FX") == 0 || strcmp(btyp, "LI") == 0 ||            strcmp(btyp, "UI") == 0))         goto skip;      if (read_item(dsa)) goto fail;      if (dsa->item[0] == '\0')      {  xprintf(            "%s:%d: missing bound value\n", dsa->fname, dsa->count);         goto fail;      }      if (str2num(dsa->item, &temp))      {  xprintf(            "%s:%d: invalid bound value\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(btyp, "LO") == 0)         lb = temp;      else if (strcmp(btyp, "UP") == 0)         ub = temp;      else if (strcmp(btyp, "FX") == 0)         lb = ub = temp;      else if (strcmp(btyp, "FR") == 0)         lb = -DBL_MAX, ub = +DBL_MAX;      else if (strcmp(btyp, "MI") == 0)         lb = -DBL_MAX;      else if (strcmp(btyp, "PL") == 0)         ub = +DBL_MAX;#if 1 /* 11/V-2006 */      else if (strcmp(btyp, "LI") == 0)      {  /* lpx_set_class(dsa->lp, LPX_MIP); */         lpx_set_col_kind(dsa->lp, j, LPX_IV);         lb = temp;      }#endif      else if (strcmp(btyp, "UI") == 0)      {  /* lpx_set_class(dsa->lp, LPX_MIP); */         lpx_set_col_kind(dsa->lp, j, LPX_IV);         ub = temp;      }      else if (strcmp(btyp, "BV") == 0)      {  /* lpx_set_class(dsa->lp, LPX_MIP); */         lpx_set_col_kind(dsa->lp, j, LPX_IV);         lb = 0.0, ub = 1.0;      }      else      {  xprintf(            "%s:%d: invalid bound type\n", dsa->fname, dsa->count);         goto fail;      }      if (lb == -DBL_MAX && ub == +DBL_MAX)         type = LPX_FR;      else if (ub == +DBL_MAX)         type = LPX_LO;      else if (lb == -DBL_MAX)         type = LPX_UP;      else if (lb != ub)         type = LPX_DB;      else         type = LPX_FX;      lpx_set_col_bnds(dsa->lp, j, type, lb, ub);      /* skip remaining characters */      while (dsa->c != '\n')         if (read_char(dsa)) goto fail;      if (read_item(dsa)) goto fail;      xassert(dsa->item[0] == '\0');      goto loop;done: return 0;fail: return 1;}int read_freemps(LPX *lp, const char *fname){     /* read problem data in free MPS format */      struct dsa _dsa, *dsa = &_dsa;      glp_erase_prob(lp);      dsa->lp = lp;      dsa->fname = fname;      dsa->fp = NULL;      dsa->count = 0;      dsa->c = '\n';      dsa->obj = 0;      xprintf("glp_read_mps: reading problem data from `%s'...\n",         dsa->fname);      dsa->fp = xfopen(dsa->fname, "r");      if (dsa->fp == NULL)      {  xprintf("glp_read_mps: unable to open `%s' - %s\n",            dsa->fname, strerror(errno));         goto fail;      }      lpx_create_index(dsa->lp);      /* read the very first character */      if (read_char(dsa)) goto fail;      /* read NAME indicator record */      if (dsa->c == ' ')err1: {  xprintf("%s:%d: NAME indicator record missing\n", dsa->fname,            dsa->count);         goto fail;      }      if (read_item(dsa)) goto fail;      if (strcmp(dsa->item, "NAME") != 0) goto err1;      if (read_item(dsa)) goto fail;      if (dsa->item[0] == '\0')         xprintf("glp_read_mps: problem name not specified\n");      else      {  xprintf("glp_read_mps: problem %s\n", dsa->item);         lpx_set_prob_name(dsa->lp, dsa->item);         while (dsa->c != '\n')            if (read_char(dsa)) goto fail;         if (read_item(dsa)) goto fail;      }      xassert(dsa->item[0] == '\0');      /* read ROWS section */      if (dsa->c == ' ')err2: {  xprintf("%s:%d: ROWS indicator record missing\n",            dsa->fname, dsa->count);         goto fail;      }      if (read_item(dsa)) goto fail;      if (strcmp(dsa->item, "ROWS") != 0) goto err2;      while (dsa->c != '\n')         if (read_char(dsa)) goto fail;      if (read_item(dsa)) goto fail;      xassert(dsa->item[0] == '\0');      if (read_rows(dsa)) goto fail;      /* read COLUMNS section */      xassert(dsa->c != ' ');      if (read_item(dsa)) goto fail;      if (strcmp(dsa->item, "COLUMNS") != 0)      {  xprintf("%s:%d: COLUMNS indicator record missing\n",            dsa->fname, dsa->count);         goto fail;      }      while (dsa->c != '\n')         if (read_char(dsa)) goto fail;      if (read_item(dsa)) goto fail;      xassert(dsa->item[0] == '\0');      if (read_columns(dsa)) goto fail;      {  int m = lpx_get_num_rows(dsa->lp);

⌨️ 快捷键说明

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