# AMPL model for a "QPS" file: this one preserves row order. # Use the awk script "q2a" to turn a QPS file into suitable data. set Aij dimen 2; #constraint matrix indices set I1; # to allow empty rows set J := setof{(i,j) in Aij} j; #columns param A{Aij}; #constraint matrix nonzeros param b{I1} default 0; #right-hand side param db{I1}; #for ranges set ctypes := {'N', 'L', 'E', 'G', 'LR', 'GR'}; param ctype{I1} symbolic within ctypes; param lb{J} default 0; param ub{J} default Infinity; var x{j in J} >= if lb[j] <= -1.7e38 then -Infinity else lb[j] <= ub[j]; set zork := setof{i in I1} (i,ctype[i]); c{i in I1: ctype[i] != 'N'}: (if ctype[i] == 'N' || ctype[i] == 'L' then -Infinity else if ctype[i] == 'G' || ctype[i] == 'GR' || ctype[i] == 'E' then b[i] else b[i] - db[i]) <= sum{(i,j) in Aij} A[i,j]*x[j] <= (if ctype[i] == 'N' || ctype[i] == 'G' then Infinity else if ctype[i] == 'L' || ctype[i] == 'LR' || ctype[i] == 'E' then b[i] else b[i] + db[i]); set Q dimen 2; param h{Q}; # quadratic terms minimize Obj{(i,'N') in zork}: -b[i] + sum{(i,j) in Aij} A[i,j]*x[j] # screwball QPS format requires distinguishing whether i = j ... + 0.5*sum{(j,k) in Q} if j == k then h[j,k]*x[j]^2 else 2*h[j,k]*x[j]*x[k];