alpar@9: /* glplpx03.c (OPB format) */ alpar@9: alpar@9: /*********************************************************************** alpar@9: * This code is part of GLPK (GNU Linear Programming Kit). alpar@9: * alpar@9: * Author: Oscar Gustafsson . alpar@9: * alpar@9: * Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, alpar@9: * 2009, 2010, 2011 Andrew Makhorin, Department for Applied Informatics, alpar@9: * Moscow Aviation Institute, Moscow, Russia. All rights reserved. alpar@9: * E-mail: . alpar@9: * alpar@9: * GLPK is free software: you can redistribute it and/or modify it alpar@9: * under the terms of the GNU General Public License as published by alpar@9: * the Free Software Foundation, either version 3 of the License, or alpar@9: * (at your option) any later version. alpar@9: * alpar@9: * GLPK is distributed in the hope that it will be useful, but WITHOUT alpar@9: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY alpar@9: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public alpar@9: * License for more details. alpar@9: * alpar@9: * You should have received a copy of the GNU General Public License alpar@9: * along with GLPK. If not, see . alpar@9: ***********************************************************************/ alpar@9: alpar@9: #define _GLPSTD_ERRNO alpar@9: #define _GLPSTD_STDIO alpar@9: #include "glpapi.h" alpar@9: #if 0 /* 24/XII-2009; by mao */ alpar@9: #include "glpipp.h" alpar@9: #endif alpar@9: alpar@9: /*---------------------------------------------------------------------- alpar@9: -- lpx_write_pb - write problem data in (normalized) OPB format. alpar@9: -- alpar@9: -- *Synopsis* alpar@9: -- alpar@9: -- #include "glplpx.h" alpar@9: -- int lpx_write_pb(LPX *lp, const char *fname, int normalized, alpar@9: -- int binarize); alpar@9: -- alpar@9: -- *Description* alpar@9: -- alpar@9: -- The routine lpx_write_pb writes problem data in OPB format alpar@9: -- to an output text file whose name is the character string fname. alpar@9: -- If normalized is non-zero the output will be generated in a alpar@9: -- normalized form with sequentially numbered variables, x1, x2 etc. alpar@9: -- If binarize, any integer variable will be repalzec by binary ones, alpar@9: -- see ipp_binarize alpar@9: -- alpar@9: -- *Returns* alpar@9: -- alpar@9: -- If the operation was successful, the routine returns zero. Otherwise alpar@9: -- the routine prints an error message and returns non-zero. */ alpar@9: alpar@9: #if 1 /* 24/XII-2009; by mao (disabled, because IPP was removed) */ alpar@9: int lpx_write_pb(LPX *lp, const char *fname, int normalized, alpar@9: int binarize) alpar@9: { xassert(lp == lp); alpar@9: xassert(fname == fname); alpar@9: xassert(normalized == normalized); alpar@9: xassert(binarize == binarize); alpar@9: xprintf("lpx_write_pb: sorry, currently this operation is not ava" alpar@9: "ilable\n"); alpar@9: return 1; alpar@9: } alpar@9: #else alpar@9: int lpx_write_pb(LPX *lp, const char *fname, int normalized, alpar@9: int binarize) alpar@9: { alpar@9: FILE* fp; alpar@9: int m,n,i,j,k,o,nonfree=0, obj_dir, dbl, *ndx, row_type, emptylhs=0; alpar@9: double coeff, *val, bound, constant/*=0.0*/; alpar@9: char* objconstname = "dummy_one"; alpar@9: char* emptylhsname = "dummy_zero"; alpar@9: alpar@9: /* Variables needed for possible binarization */ alpar@9: /*LPX* tlp;*/ alpar@9: IPP *ipp = NULL; alpar@9: /*tlp=lp;*/ alpar@9: alpar@9: if(binarize) /* Transform integer variables to binary ones */ alpar@9: { alpar@9: ipp = ipp_create_wksp(); alpar@9: ipp_load_orig(ipp, lp); alpar@9: ipp_binarize(ipp); alpar@9: lp = ipp_build_prob(ipp); alpar@9: } alpar@9: fp = fopen(fname, "w"); alpar@9: alpar@9: if(fp!= NULL) alpar@9: { alpar@9: xprintf( alpar@9: "lpx_write_pb: writing problem in %sOPB format to `%s'...\n", alpar@9: (normalized?"normalized ":""), fname); alpar@9: alpar@9: m = glp_get_num_rows(lp); alpar@9: n = glp_get_num_cols(lp); alpar@9: for(i=1;i<=m;i++) alpar@9: { alpar@9: switch(glp_get_row_type(lp,i)) alpar@9: { alpar@9: case GLP_LO: alpar@9: case GLP_UP: alpar@9: case GLP_FX: alpar@9: { alpar@9: nonfree += 1; alpar@9: break; alpar@9: } alpar@9: case GLP_DB: alpar@9: { alpar@9: nonfree += 2; alpar@9: break; alpar@9: } alpar@9: } alpar@9: } alpar@9: constant=glp_get_obj_coef(lp,0); alpar@9: fprintf(fp,"* #variables = %d #constraints = %d\n", alpar@9: n + (constant == 0?1:0), nonfree + (constant == 0?1:0)); alpar@9: /* Objective function */ alpar@9: obj_dir = glp_get_obj_dir(lp); alpar@9: fprintf(fp,"min: "); alpar@9: for(i=1;i<=n;i++) alpar@9: { alpar@9: coeff = glp_get_obj_coef(lp,i); alpar@9: if(coeff != 0.0) alpar@9: { alpar@9: if(obj_dir == GLP_MAX) alpar@9: coeff=-coeff; alpar@9: if(normalized) alpar@9: fprintf(fp, " %d x%d", (int)coeff, i); alpar@9: else alpar@9: fprintf(fp, " %d*%s", (int)coeff, alpar@9: glp_get_col_name(lp,i)); alpar@9: alpar@9: } alpar@9: } alpar@9: if(constant) alpar@9: { alpar@9: if(normalized) alpar@9: fprintf(fp, " %d x%d", (int)constant, n+1); alpar@9: else alpar@9: fprintf(fp, " %d*%s", (int)constant, objconstname); alpar@9: } alpar@9: fprintf(fp,";\n"); alpar@9: alpar@9: if(normalized && !binarize) /* Name substitution */ alpar@9: { alpar@9: fprintf(fp,"* Variable name substitution:\n"); alpar@9: for(j=1;j<=n;j++) alpar@9: { alpar@9: fprintf(fp, "* x%d = %s\n", j, glp_get_col_name(lp,j)); alpar@9: } alpar@9: if(constant) alpar@9: fprintf(fp, "* x%d = %s\n", n+1, objconstname); alpar@9: } alpar@9: alpar@9: ndx = xcalloc(1+n, sizeof(int)); alpar@9: val = xcalloc(1+n, sizeof(double)); alpar@9: alpar@9: /* Constraints */ alpar@9: for(j=1;j<=m;j++) alpar@9: { alpar@9: row_type=glp_get_row_type(lp,j); alpar@9: if(row_type!=GLP_FR) alpar@9: { alpar@9: if(row_type == GLP_DB) alpar@9: { alpar@9: dbl=2; alpar@9: row_type = GLP_UP; alpar@9: } alpar@9: else alpar@9: { alpar@9: dbl=1; alpar@9: } alpar@9: k=glp_get_mat_row(lp, j, ndx, val); alpar@9: for(o=1;o<=dbl;o++) alpar@9: { alpar@9: if(o==2) alpar@9: { alpar@9: row_type = GLP_LO; alpar@9: } alpar@9: if(k==0) /* Empty LHS */ alpar@9: { alpar@9: emptylhs = 1; alpar@9: if(normalized) alpar@9: { alpar@9: fprintf(fp, "0 x%d ", n+2); alpar@9: } alpar@9: else alpar@9: { alpar@9: fprintf(fp, "0*%s ", emptylhsname); alpar@9: } alpar@9: } alpar@9: alpar@9: for(i=1;i<=k;i++) alpar@9: { alpar@9: if(val[i] != 0.0) alpar@9: { alpar@9: alpar@9: if(normalized) alpar@9: { alpar@9: fprintf(fp, "%d x%d ", alpar@9: (row_type==GLP_UP)?(-(int)val[i]):((int)val[i]), ndx[i]); alpar@9: } alpar@9: else alpar@9: { alpar@9: fprintf(fp, "%d*%s ", (int)val[i], alpar@9: glp_get_col_name(lp,ndx[i])); alpar@9: } alpar@9: } alpar@9: } alpar@9: switch(row_type) alpar@9: { alpar@9: case GLP_LO: alpar@9: { alpar@9: fprintf(fp, ">="); alpar@9: bound = glp_get_row_lb(lp,j); alpar@9: break; alpar@9: } alpar@9: case GLP_UP: alpar@9: { alpar@9: if(normalized) alpar@9: { alpar@9: fprintf(fp, ">="); alpar@9: bound = -glp_get_row_ub(lp,j); alpar@9: } alpar@9: else alpar@9: { alpar@9: fprintf(fp, "<="); alpar@9: bound = glp_get_row_ub(lp,j); alpar@9: } alpar@9: alpar@9: break; alpar@9: } alpar@9: case GLP_FX: alpar@9: { alpar@9: fprintf(fp, "="); alpar@9: bound = glp_get_row_lb(lp,j); alpar@9: break; alpar@9: } alpar@9: } alpar@9: fprintf(fp," %d;\n",(int)bound); alpar@9: } alpar@9: } alpar@9: } alpar@9: xfree(ndx); alpar@9: xfree(val); alpar@9: alpar@9: if(constant) alpar@9: { alpar@9: xprintf( alpar@9: "lpx_write_pb: adding constant objective function variable\n"); alpar@9: alpar@9: if(normalized) alpar@9: fprintf(fp, "1 x%d = 1;\n", n+1); alpar@9: else alpar@9: fprintf(fp, "1*%s = 1;\n", objconstname); alpar@9: } alpar@9: if(emptylhs) alpar@9: { alpar@9: xprintf( alpar@9: "lpx_write_pb: adding dummy variable for empty left-hand si" alpar@9: "de constraint\n"); alpar@9: alpar@9: if(normalized) alpar@9: fprintf(fp, "1 x%d = 0;\n", n+2); alpar@9: else alpar@9: fprintf(fp, "1*%s = 0;\n", emptylhsname); alpar@9: } alpar@9: alpar@9: } alpar@9: else alpar@9: { alpar@9: xprintf("Problems opening file for writing: %s\n", fname); alpar@9: return(1); alpar@9: } alpar@9: fflush(fp); alpar@9: if (ferror(fp)) alpar@9: { xprintf("lpx_write_pb: can't write to `%s' - %s\n", fname, alpar@9: strerror(errno)); alpar@9: goto fail; alpar@9: } alpar@9: fclose(fp); alpar@9: alpar@9: alpar@9: if(binarize) alpar@9: { alpar@9: /* delete the resultant problem object */ alpar@9: if (lp != NULL) lpx_delete_prob(lp); alpar@9: /* delete MIP presolver workspace */ alpar@9: if (ipp != NULL) ipp_delete_wksp(ipp); alpar@9: /*lp=tlp;*/ alpar@9: } alpar@9: return 0; alpar@9: fail: if (fp != NULL) fclose(fp); alpar@9: return 1; alpar@9: } alpar@9: #endif alpar@9: alpar@9: /* eof */