zoukankan      html  css  js  c++  java
  • Netlib文件转化为mps文件

    Netlib文件转化为mps文件

    简单方法1

    下载并执行:

    git clone https://github.com/mtanneau/Netlib_experiments.git
    cd Netlib_experiments/dat
    download_netlib.sh
    ../ooqp/convert_to_mps.sh
    

    简单方法2

    下载地址

    原始方法

    建立emps.c文件内容如下

    
    /* Expand compressed LP programs (in netlib format) to MPS format.
     * This is similar to the Fortran program emps.f , except that it
     * understands command-line arguments, including the -m option,
     * which causes "mystery lines" to be included in the output.
     * ("Mystery lines" allow extensions to MPS format.  At the time of
     * this writing, however, none of the netlib problems contain
     * mystery lines.)
     *
     * Written by David M. Gay of AT&T Bell Laboratories.
     *
     * For use on MS-DOS machines, you must supply routines described in
     * the comments near the #ifdef MSDOS and #ifndef MSDOS lines below.
     *
     * Modification to -S and -s options (31 Oct. 2000):  append ".mps"
     * to file names unless compiled with -DNO_dot_mps.
     */
    
    #include <stdio.h>
    #ifdef DeSmet
    extern char *strcpy(), *strncpy();
    FILE *fopen(), *freopen();
    #else
    #include <string.h>
    #endif
    
    #ifdef KR_headers
    #define Void /*void*/
    void exit();
    char *malloc();
    void	badchk(), cantopen(), colout(), namfetch(),
    	namstore(), process(), scream(), usage();
    #else
    #define Void void
    #include <stdlib.h>
     void badchk(char *buf);
     void cantopen(char *);
     void colout(char *head, long nz, int what);
     void namfetch(int, char s[8]);
     void namstore(int, char s[8]);
     void process(FILE *, char *infile1);
     void scream(char *, char *);
     void usage(char **, int rc);
    #endif
    
    /* Define trtab to make this source self-contained... */
    char trtab[] = "!"#$%&'()*+,-./0123456789;<=>?@
    ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~";
    
    char chkbuf[76], *infile, *lastl, *progname, *ss, invtrtab[256];
    
    #ifndef MSDOS
    char *bigstore;
    unsigned BSsize;
    #endif
    
    FILE *inf;
    int blanksubst, canend, cn, just1, keepmyst = 1, kmax, ncs, sflag;
    long nline, nrow;
    char ***xargv;
    
     int
    #ifdef KR_headers
    main(argc,argv) int argc; char **argv;
    #else
    main(int argc, char **argv)
    #endif
    {
    	char *s, *se;
    	FILE *f;
    	static char *options[] = {
    		"-1  {output only 1 nonzero per line}",
    		"-b  {replace blanks within names by _'s}",
    		"-m  {skip mystery lines}",
    		"-S  {split output by problems: put each problem in the file",
    #ifdef NO_dot_mps /*{*/
    		"	named by the first word after "NAME" on the NAME line}",
    #else
    		"	named by the first word after "NAME" on the NAME line,",
    		"	with ".mps" appended}",
    #endif
    		"-s  {like -S, but force file names to lower case}",
    		0};
    
    	for(s = invtrtab, se = s + sizeof(invtrtab); s < se; s++) *s = 92;
    	for(s = se = trtab; *s; s++) invtrtab[*s] = s - se;
    	*chkbuf = ' ';
    
    #ifdef MSDOS
    	progname = "emps";
    	argexpan(&argc, &argv);	/* expand wildcard characters */
    #else
    	progname = *argv;
    #endif
    	xargv = &argv;
    
    	while(s = *++argv)
    		if (*s == '-') switch(s[1]) {
    
    			case 0: process(stdin, "<stdin>"); break;
    
    			case '1': just1 = 1; break;
    
    			case 'b': blanksubst = '_'; break;
    
    			case 'm': keepmyst = 0; break;
    
    			case 'S': sflag = 1; break;
    			case 's': sflag = 2; break;
    
    			case '?': usage(options,0);
    
    			default:
    				fprintf(stderr, "%s: invalid option %s
    ",
    					progname, s);
    				usage(options,1);
    			}
    		else {
    			f = fopen(s, "r");
    			if (!f)
    				cantopen(s);
    			process(f, s);
    			}
    	if (!infile) process(stdin, "<stdin>");
    	return 0;
    	}
    
     void
    #ifdef KR_headers
    cantopen(s) char *s;
    #else
    cantopen(char *s)
    #endif
     {
    	fprintf(stderr, "%s: can't open %s
    ", progname, s);
    	exit(1);
    	}
    
     void
    #ifdef KR_headers
    usage(o,rc) char **o; int rc;
    #else
    usage(char **o, int rc)
    #endif
    {
    	char *s;
    
    	fprintf(stderr, "Usage: %s [options] [file ...]
    Options:
    ",
    			progname);
    	while(s = *o++) fprintf(stderr, "	%s
    ", s);
    	exit(rc);
    	}
    
     void
    #ifdef KR_headers
    scream(s, t) char *s, *t;
    #else
    scream(char *s, char *t)
    #endif
    {
    	long c;
    	fprintf(stderr, "%s: ", progname);
    	fprintf(stderr, s, t);
    	/* separate computation of c to overcome DeSmet compiler bug */
    	c = ftell(inf) - strlen(lastl);
    	fprintf(stderr, ": line %ld (char %ld) of %s
    ", nline, c, infile);
    	exit(1);
    	}
    
    FILE *
    #ifdef KR_headers
    newfile(n) int n;
    #else
    newfile(int n)
    #endif
    {
    	char **av, *s1;
    	FILE *f = 0;
    
    	av = *xargv;
    	if (*av && (s1 = *++av) && *s1 != '-') {
    		fclose(inf);
    		f = fopen(s1, "r");
    		if (!f) cantopen(s1);
    		inf = f;
    		infile = s1;
    		*xargv = av;
    		nline = n;
    		}
    	return f;
    	}
    
    char *fname[72];
    long fline[72];
    
    #define tr(x) Tr[x]
    
     void
    early_eof(Void)
    { scream("premature end of file", lastl = ""); }
    
     void
    #ifdef KR_headers
    checkchar(s) char *s;
    #else
    checkchar(char *s)
    #endif
    {
    	int c;
    	unsigned int x;
    	char *Tr = invtrtab;
    
    	for(x = 0; c = *s; s++) {
    		if (c == '
    ')
    			{ *s = 0; break; }
    		c = tr(c);
    		if (x & 1)
    			x = (x >> 1) + c + 16384;
    		else
    			x = (x >> 1) + c;
    		}
    	fname[ncs] = infile;
    	fline[ncs] = nline;
    	chkbuf[ncs++] = trtab[x % 92];
    	}
    
     void
    #ifdef KR_headers
    checkline(f) FILE *f;
    #else
    checkline(FILE *f)
    #endif
    {
    	char chklin[76];
    	canend = 0;
     again:
    	chkbuf[ncs++] = '
    ';
    	chkbuf[ncs] = 0;
    	nline++;
    	while(!fgets(chklin,76,f))
    		if (!(f = newfile(1)))
    			early_eof();
    	if (strcmp(chklin,chkbuf)) {
    		if (*chklin == ':' && ncs <= 72) {
    			ncs--;
    			checkchar(chklin);
    			if (keepmyst)
    				printf("%s
    ",chklin+1);
    			goto again;
    			}
    		badchk(chklin);
    		}
    	ncs = 1;
    	}
    
     char *
    #ifdef KR_headers
    rdline(s) char s[77];
    #else
    rdline(char s[77])
    #endif
    {
    	FILE *f = inf;
    
    again:
    	nline++;
    	if (!fgets(s, 77, f)) {
    		if (f = newfile(0))
    			goto again;
    		if (canend)
    			return 0;
    		early_eof();
    		}
    	checkchar(s);
    	if (ncs >= 72)
    		checkline(f);
    	if (*s == ':') {
    		if (keepmyst)
    			printf("%s
    ",s+1);
    		goto again;
    		}
    	return lastl = s;
    	}
    
     void
    #ifdef KR_headers
    blankfix(s) char *s;
    #else
    blankfix(char *s)
    #endif
    {
    	for(; *s; s++)
    		if (*s == ' ')
    			*s = blanksubst;
    	}
    
     int
    #ifdef KR_headers
    exindx(s) char **s;
    #else
    exindx(char **s)	/* expand supersparse index */
    #endif
    {
    	char *Tr = invtrtab;
    	char *z = *s;
    	int k, x;
    
    	k = tr(*z++);
    	if (k >= 46) scream("exindx: Bad index in %s", z);
    	if (k >= 23) x = k - 23;
    	else {
    		x = k;
    		for(;;) {
    			k = tr(*z++);
    			x = x*46 + k;
    			if (k >= 46) { x -= 46; break; }
    			}
    		}
    	*s = z;
    	return x;
    	}
    
    char *
    #ifdef KR_headers
    exform(s0, Z) char *s0, **Z;
    #else
    exform(char *s0, char **Z)	/* expand *Z into s0 */
    #endif
    {
    	int ex, k, nd, nelim;
    	char *d, db[32], sbuf[32], *s;
    	long x, y = 0;
    	char *Tr = invtrtab;
    	char *z = *Z;
    
    	d = db;
    	k = tr(*z++);
    	if (k < 46) { /* supersparse index */
    		k = exindx(Z);
    		if (k > kmax) {
    			char msgbuf[64];
    			sprintf(msgbuf, "index %u > kmax = %u in %%s", k, kmax);
    			scream(msgbuf, z-1);
    			}
    		return ss + (k << 4);
    		}
    	s = sbuf;
    	k -= 46;
    	if (k >= 23) { *s++ = '-'; k -= 23; nelim = 11; }
    	else nelim = 12;
    	if (k >= 11) { /* integer floating-point */
    		k -= 11;
    		*d++ = '.';
    		if (k >= 6) x = k - 6;
    		else {
    			x = k;
    			for(;;) {
    				k = tr(*z++);
    				/* x = x*46 + k; */
    				x *= 46; x += k; /* two stmts bypass DeSmet bug */
    				if (k >= 46) { x -= 46; break; }
    				}
    			}
    		if (!x) *d++ = '0';
    		else do {
    			*d++ = '0' + x%10;
    			x /= 10;
    			} while(x);
    		do *s++ = *--d; while(d > db);
    		}
    	else { /* general floating-point */
    		ex = (int)tr(*z++) - 50;
    		x = tr(*z++);
    		while(--k >= 0) {
    			if (x >= 100000000) { y = x; x = tr(*z++); }
    			/* else x = x*92 + tr(*z++); */
    			else { x *= 92; x += tr(*z++); } /* bypass DeSmet bug */
    			}
    		if (y) {
    			while(x > 1) { *d++ = x%10 + '0'; x /= 10; }
    			for(;; y /= 10) {
    				*d++ = y%10 + '0';
    				if (y < 10) break;
    				}
    			}
    		else if (x) for(;; x /= 10) {
    			*d++ = x%10 + '0';
    			if (x < 10) break;
    			}
    		else *d++ = '0';
    		nd = d - db + ex;
    		if (ex > 0) {
    			if (nd < nelim || ex < 3) {
    				while(d > db) *s++ = *--d;
    				do *s++ = '0'; while(--ex);
    				*s++ = '.';
    				}
    			else goto Eout;
    			}
    		else if (nd >= 0) {
    			while(--nd >= 0) *s++ = *--d;
    			*s++ = '.';
    			while(d > db) *s++ = *--d;
    			}
    		else if (ex > -nelim) {
    			*s++ = '.';
    			while(++nd <= 0) *s++ = '0';
    			while(d > db) *s++ = *--d;
    			}
    		else {
    Eout:
    			ex += d - db - 1;
    			if (ex == -10) ex = -9;
    			else {
    				if (ex > 9 && ex <= d - db + 8) {
    					do { *s++ = *--d;
    						} while (--ex > 9);
    					}
    				*s++ = *--d;
    				}
    			*s++ = '.';
    			while(d > db) *s++ = *--d;
    			*s++ = 'E';
    			if (ex < 0) { *s++ = '-'; ex = -ex; }
    			while(ex) { *d++ = '0' + ex%10; ex /= 10; }
    			while(d > db) *s++ = *--d;
    			}
    		}
    	*s = 0;
    	k = s - sbuf;
    	s = s0;
    	while(k++ < 12) *s++ = ' ';
    	strcpy(s, sbuf);
    	*Z = z;
    	return s0;
    	}
    
     void
    #ifdef KR_headers
    newofile(buf) char *buf;
    #else
    newofile(char *buf)
    #endif
    {
    	unsigned char *s, *t;
    	int c;
    	char namebuf[80];
    
    	for(s = (unsigned char *)buf + 4; *s <= ' '; s++)
    		if (!*s)
    			scream("Blank NAME line","");
    	t = (unsigned char *)namebuf;
    	if (sflag == 2)
    		while((c = *s++) > ' ')
    			*t++ = c >= 'A' && c <= 'Z' ? c + 'a' - 'A' : c;
    	else
    		while((c = *s++) > ' ')
    			*t++ = c;
    	*t = 0;
    #ifndef NO_dot_mps
    	if (t < (unsigned char*)namebuf + 75)
    		strcpy((char*)t, ".mps");
    #endif
    	if (!freopen(namebuf, "w", stdout))
    		scream("can't open "%s"", namebuf);
    	}
    
     void
    #ifdef KR_headers
    process(f, infile1) FILE *f; char *infile1;
    #else
    process(FILE *f, char *infile1)
    #endif
    {
    	char *b1, buf[80], *s, *ss0, *z;
    	long ncol, colmx, nz, nrhs, rhsnz, nran, ranz, nbd, bdnz, ns;
    	int i;
    
    	infile = infile1;
    	inf = f;
    	nline = 0;
    	canend = 0;
    	ncs = 1;
    	rdline(buf);
    top:
    	kmax = -1;
    	ncs = 1;
    
    	/* NAME line */
    
    	while (strncmp(buf,"NAME",4))
    		if (!rdline(buf))
    			goto done;
    	canend = 0;
    	if (sflag)
    		newofile(buf);
    	printf("%s
    ", buf);
    	ncs = 1;
    
    	/* problem statistics */
    
    	rdline(buf);
    	if (sscanf(buf,"%ld %ld %ld %ld %ld %ld %ld %ld", &nrow, &ncol,
    		&colmx, &nz, &nrhs, &rhsnz, &nran, &ranz) != 8 ||
    		rdline(buf), sscanf(buf, "%ld %ld %ld", &nbd, &bdnz, &ns) != 3)
    			scream("Bad statistics line:
    %s
    ", buf);
    	ncs = 1;
    	cn = nrow;
    	i = cn + ncol;
    	if (i != nrow + ncol) scream("Problem too big", "");
    
    	/* read, expand number table */
    
    #ifdef MSDOS
    	ss0 = malloc((unsigned)((int)ns<<4));
    #else
    	BSsize = nrow + ncol;
    	ss0 = malloc((unsigned)(ns<<4) + (BSsize<<3));
    	bigstore = ss0 + (ns<<4) - 8;
    #endif
    	if (!ss0) scream("malloc failure!","");
    	ss = ss0 - 16;
    	z = "";
    	for(s = ss0, i = ns; i--; s += 16) {
    		if (!*z) z = rdline(buf);
    		exform(s, &z);
    		}
    	kmax = ns;
    
    	/* read, print row names */
    
    	b1 = buf + 1;
    	for(i = 1; i <= nrow; i++) {
    		rdline(buf);
    		if (i == 1) printf("ROWS
    ");
    		if (blanksubst)
    			blankfix(b1);
    		printf(" %c  %s
    ", *buf, b1);
    		namstore(i, b1);
    		}
    
    	/* read, print columns */
    
    	colout("COLUMNS", nz, 1);
    
    	/* right-hand sides */
    
    	colout("RHS", rhsnz, 2);
    
    	/* ranges */
    
    	colout("RANGES", ranz, 3);
    
    	/* bounds */
    
    	colout("BOUNDS", bdnz, 4);
    
    	/* final checksum line... */
    
    	if (ncs > 1)
    		checkline(inf);
    
    	printf("ENDATA
    ");
    
    	/* see whether there's another LP in this file... */
    
    	free(ss0);
    	canend = ncs = 1;
    	if (rdline(buf))
    		goto top;
     done:
    	fclose(inf);
    	}
    
     void
    #ifdef KR_headers
    colout(head, nz, what) char *head; long nz; int what;
    #else
    colout(char *head, long nz, int what)
    #endif
    {
    	static char *bt[] = {"UP", "LO", "FX", "FR", "MI", "PL"},
    		fmt2[] = "    %-8.8s  %-8.8s  %-15.15s%-8.8s  %.15s
    ";
    	char buf[80], curcol[8], msgbuf[32],
    		*rc1, *rc2,  rcbuf1[16], rcbuf2[16], rownm[2][8], *z;
    	int first, k, n;
    
    	if (!nz) {
    		if (what <= 2) printf("%s
    ", head);
    		return;
    		}
    
    	first = 1;
    	k = 0;
    	z = "";
    	*curcol = 0;
    	while(nz--) {
    		if (!*z) z = rdline(buf);
    		if (first) { printf("%s
    ", head); first = 0; }
    		while(!(n = exindx(&z))) {
    			if (k) {
    				printf("    %-8.8s  %-8.8s  %.15s
    ",
    					curcol, rownm[0], rc1);
    				k = 0;
    				}
    			if (blanksubst)
    				if (*z)
    					blankfix(z);
    				else
    					z = head;
    			strncpy(curcol, z, 8);
    			if (what == 1) namstore(++cn, z);
    			z = rdline( buf);
    			}
    		if (what >= 4) {
    			if (n >= 7) {
    				sprintf(msgbuf, "bad bound type index = %d",n);
    				scream(msgbuf, "");
    				}
    			if (!*z) z = rdline(buf);
    			namfetch((int)nrow + exindx(&z), rownm[0]);
    			if (n-- >= 4) {
    				printf(" %s %-8.8s  %.8s
    ", bt[n],
    					curcol, *rownm);
    				continue;
    				}
    			}
    		else namfetch(n, rownm[k]);
    		if (!*z) z = rdline(buf);
    		if (k) rc2 = exform(rcbuf2, &z);
    		else rc1 = exform(rcbuf1, &z);
    		if (what <= 3) {
    			if (just1)
    				printf("    %-8.8s  %-8.8s  %.15s
    ",
    					curcol, rownm[0], rc1);
    			else {
    				if (++k == 1) continue;
    				printf(fmt2, curcol, rownm[0], rc1,
    					rownm[1], rc2);
    				k = 0;
    				}
    			}
    		else printf(" %s %-8.8s  %-8.8s  %.15s
    ", bt[n], curcol,
    				rownm[0], rc1);
    		}
    	if (k) printf("    %-8.8s  %-8.8s  %.15s
    ", curcol, *rownm, rc1);
    	}
    
     void
    #ifdef KR_headers
    badchk(buf) char *buf;
    #else
    badchk(char *buf)
    #endif
    {
    	int i;
    	static char csl[] = "Check sum line =";
    	char *mb = csl, msgbuf[64];
    
    	fprintf(stderr, "%s: Check sum error: expected
    %s
    but got
    %s
    ",
    		progname, chkbuf, buf);
    	lastl = buf;
    	if (*buf == ' ') {
    		for(i = 1; chkbuf[i] == buf[i]; i++);
    		sprintf(msgbuf, "Bad check sum for line %ld of %s
    %%s",
    			fline[i], fname[i]);
    		mb = msgbuf;
    		}
    	scream(mb, csl);
    	}
    
    #ifndef MSDOS
    /* The following routines are assembly coded in the MS-DOS version
     * that I (dmg) compile with the De Smet C compiler; they extend the
     * size of problems that the small-memory MS-DOS version of emps can
     * handle.  If you have compiler that makes "huge" pointers available
     * and can arrange for bigstore to be a huge pointer (one that can
     * address a region larger than 64 kilobytes), then you can use
     * suitably modified versions of the namfetch and namstore given below.
     * (If you are using the large memory model, then this only matters
     * for the larger problems, those for which the number of rows plus
     * the number of columns is more than 8191.)
     */
    static char bmsg[] = "Bad i to %s";
    
     void
    #ifdef KR_headers
    namstore(i,s) int i; char s[8];
    #else
    namstore(int i, char s[8])
    #endif
    {
    	if (i <= 0 || i > BSsize) scream(bmsg, "namstore");
    	strncpy(bigstore + (i<<3), s, 8);
    	}
    
     void
    #ifdef KR_headers
    namfetch(i,s) int i; char s[8];
    #else
    namfetch(int i, char s[8])
    #endif
    {
    	if (i <= 0 || i > BSsize) scream(bmsg, "namfetch");
    	strncpy(s, bigstore + (i<<3), 8);
    	}
    #endif
    
    

    建立test文件内容如下

    gcc emps.c
    mkdir $1
    cd data
    for file in *;
    do
       echo $file
       #echo $2/$file".mps"
       ../a.out $file > ../$1/$file".mps"
       #sudo gurobi_cl $file
    done
    

    建立新文件夹mymps,执行

    mkdir mymps
    cd mymps
    ../test
    
  • 相关阅读:
    初始JSON
    JS异步加载的三种方式
    JS之事件
    关于null == 0?返回false的问题
    JS之类型转换
    金融(一)
    使用var声明的变量 和 直接赋值并未声明的变量的区别
    POJ2594 Treasure Exploration
    POJ1422 Air Raid
    Codevs1922 骑士共存问题
  • 原文地址:https://www.cnblogs.com/qujingtongxiao/p/11388907.html
Copyright © 2011-2022 走看看