src/glplpx03.c
changeset 1 c445c931472f
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/glplpx03.c	Mon Dec 06 13:09:21 2010 +0100
     1.3 @@ -0,0 +1,302 @@
     1.4 +/* glplpx03.c (OPB format) */
     1.5 +
     1.6 +/***********************************************************************
     1.7 +*  This code is part of GLPK (GNU Linear Programming Kit).
     1.8 +*
     1.9 +*  Author: Oscar Gustafsson <oscarg@isy.liu.se>.
    1.10 +*
    1.11 +*  Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
    1.12 +*  2009, 2010 Andrew Makhorin, Department for Applied Informatics,
    1.13 +*  Moscow Aviation Institute, Moscow, Russia. All rights reserved.
    1.14 +*  E-mail: <mao@gnu.org>.
    1.15 +*
    1.16 +*  GLPK is free software: you can redistribute it and/or modify it
    1.17 +*  under the terms of the GNU General Public License as published by
    1.18 +*  the Free Software Foundation, either version 3 of the License, or
    1.19 +*  (at your option) any later version.
    1.20 +*
    1.21 +*  GLPK is distributed in the hope that it will be useful, but WITHOUT
    1.22 +*  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
    1.23 +*  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
    1.24 +*  License for more details.
    1.25 +*
    1.26 +*  You should have received a copy of the GNU General Public License
    1.27 +*  along with GLPK. If not, see <http://www.gnu.org/licenses/>.
    1.28 +***********************************************************************/
    1.29 +
    1.30 +#define _GLPSTD_ERRNO
    1.31 +#define _GLPSTD_STDIO
    1.32 +#include "glpapi.h"
    1.33 +#if 0 /* 24/XII-2009; by mao */
    1.34 +#include "glpipp.h"
    1.35 +#endif
    1.36 +
    1.37 +/*----------------------------------------------------------------------
    1.38 +-- lpx_write_pb - write problem data in (normalized) OPB format.
    1.39 +--
    1.40 +-- *Synopsis*
    1.41 +--
    1.42 +-- #include "glplpx.h"
    1.43 +-- int lpx_write_pb(LPX *lp, const char *fname, int normalized,
    1.44 +--    int binarize);
    1.45 +--
    1.46 +-- *Description*
    1.47 +--
    1.48 +-- The routine lpx_write_pb writes problem data in OPB format
    1.49 +-- to an output text file whose name is the character string fname.
    1.50 +-- If normalized is non-zero the output will be generated in a
    1.51 +-- normalized form with sequentially numbered variables, x1, x2 etc.
    1.52 +-- If binarize, any integer variable will be repalzec by binary ones,
    1.53 +-- see ipp_binarize
    1.54 +--
    1.55 +-- *Returns*
    1.56 +--
    1.57 +-- If the operation was successful, the routine returns zero. Otherwise
    1.58 +-- the routine prints an error message and returns non-zero. */
    1.59 +
    1.60 +#if 1 /* 24/XII-2009; by mao (disabled, because IPP was removed) */
    1.61 +int lpx_write_pb(LPX *lp, const char *fname, int normalized,
    1.62 +      int binarize)
    1.63 +{     xassert(lp == lp);
    1.64 +      xassert(fname == fname);
    1.65 +      xassert(normalized == normalized);
    1.66 +      xassert(binarize == binarize);
    1.67 +      xprintf("lpx_write_pb: sorry, currently this operation is not ava"
    1.68 +         "ilable\n");
    1.69 +      return 1;
    1.70 +}
    1.71 +#else
    1.72 +int lpx_write_pb(LPX *lp, const char *fname, int normalized,
    1.73 +      int binarize)
    1.74 +{
    1.75 +  FILE* fp;
    1.76 +  int m,n,i,j,k,o,nonfree=0, obj_dir, dbl, *ndx, row_type, emptylhs=0;
    1.77 +  double coeff, *val, bound, constant/*=0.0*/;
    1.78 +  char* objconstname = "dummy_one";
    1.79 +  char* emptylhsname = "dummy_zero";
    1.80 +
    1.81 +  /* Variables needed for possible binarization */
    1.82 +  /*LPX* tlp;*/
    1.83 +  IPP *ipp = NULL;
    1.84 +  /*tlp=lp;*/
    1.85 +
    1.86 +  if(binarize) /* Transform integer variables to binary ones */
    1.87 +    {
    1.88 +      ipp = ipp_create_wksp();
    1.89 +      ipp_load_orig(ipp, lp);
    1.90 +      ipp_binarize(ipp);
    1.91 +      lp = ipp_build_prob(ipp);
    1.92 +    }
    1.93 +  fp = fopen(fname, "w");
    1.94 +
    1.95 +  if(fp!= NULL)
    1.96 +    {
    1.97 +      xprintf(
    1.98 +          "lpx_write_pb: writing problem in %sOPB format to `%s'...\n",
    1.99 +              (normalized?"normalized ":""), fname);
   1.100 +
   1.101 +      m = glp_get_num_rows(lp);
   1.102 +      n = glp_get_num_cols(lp);
   1.103 +      for(i=1;i<=m;i++)
   1.104 +        {
   1.105 +          switch(glp_get_row_type(lp,i))
   1.106 +            {
   1.107 +            case GLP_LO:
   1.108 +            case GLP_UP:
   1.109 +            case GLP_FX:
   1.110 +              {
   1.111 +                nonfree += 1;
   1.112 +                break;
   1.113 +              }
   1.114 +            case GLP_DB:
   1.115 +              {
   1.116 +                nonfree += 2;
   1.117 +                break;
   1.118 +              }
   1.119 +            }
   1.120 +        }
   1.121 +      constant=glp_get_obj_coef(lp,0);
   1.122 +      fprintf(fp,"* #variables = %d #constraints = %d\n",
   1.123 +         n + (constant == 0?1:0), nonfree + (constant == 0?1:0));
   1.124 +      /* Objective function */
   1.125 +      obj_dir = glp_get_obj_dir(lp);
   1.126 +      fprintf(fp,"min: ");
   1.127 +      for(i=1;i<=n;i++)
   1.128 +        {
   1.129 +          coeff = glp_get_obj_coef(lp,i);
   1.130 +          if(coeff != 0.0)
   1.131 +            {
   1.132 +              if(obj_dir == GLP_MAX)
   1.133 +                coeff=-coeff;
   1.134 +              if(normalized)
   1.135 +                fprintf(fp, " %d x%d", (int)coeff, i);
   1.136 +              else
   1.137 +                fprintf(fp, " %d*%s", (int)coeff,
   1.138 +                  glp_get_col_name(lp,i));
   1.139 +
   1.140 +            }
   1.141 +        }
   1.142 +      if(constant)
   1.143 +        {
   1.144 +          if(normalized)
   1.145 +            fprintf(fp, " %d x%d", (int)constant, n+1);
   1.146 +          else
   1.147 +            fprintf(fp, " %d*%s", (int)constant, objconstname);
   1.148 +        }
   1.149 +      fprintf(fp,";\n");
   1.150 +
   1.151 +      if(normalized && !binarize)  /* Name substitution */
   1.152 +        {
   1.153 +          fprintf(fp,"* Variable name substitution:\n");
   1.154 +          for(j=1;j<=n;j++)
   1.155 +            {
   1.156 +              fprintf(fp, "* x%d = %s\n", j, glp_get_col_name(lp,j));
   1.157 +            }
   1.158 +          if(constant)
   1.159 +            fprintf(fp, "* x%d = %s\n", n+1, objconstname);
   1.160 +        }
   1.161 +
   1.162 +      ndx = xcalloc(1+n, sizeof(int));
   1.163 +      val = xcalloc(1+n, sizeof(double));
   1.164 +
   1.165 +      /* Constraints */
   1.166 +      for(j=1;j<=m;j++)
   1.167 +        {
   1.168 +          row_type=glp_get_row_type(lp,j);
   1.169 +          if(row_type!=GLP_FR)
   1.170 +            {
   1.171 +              if(row_type == GLP_DB)
   1.172 +                {
   1.173 +                  dbl=2;
   1.174 +                  row_type = GLP_UP;
   1.175 +                }
   1.176 +              else
   1.177 +                {
   1.178 +                  dbl=1;
   1.179 +                }
   1.180 +              k=glp_get_mat_row(lp, j, ndx, val);
   1.181 +              for(o=1;o<=dbl;o++)
   1.182 +                {
   1.183 +                  if(o==2)
   1.184 +                    {
   1.185 +                      row_type = GLP_LO;
   1.186 +                    }
   1.187 +                  if(k==0) /* Empty LHS */
   1.188 +                    {
   1.189 +                      emptylhs = 1;
   1.190 +                      if(normalized)
   1.191 +                        {
   1.192 +                          fprintf(fp, "0 x%d ", n+2);
   1.193 +                        }
   1.194 +                      else
   1.195 +                        {
   1.196 +                          fprintf(fp, "0*%s ", emptylhsname);
   1.197 +                        }
   1.198 +                    }
   1.199 +
   1.200 +                  for(i=1;i<=k;i++)
   1.201 +                    {
   1.202 +                      if(val[i] != 0.0)
   1.203 +                        {
   1.204 +
   1.205 +                          if(normalized)
   1.206 +                            {
   1.207 +                              fprintf(fp, "%d x%d ",
   1.208 +              (row_type==GLP_UP)?(-(int)val[i]):((int)val[i]), ndx[i]);
   1.209 +                            }
   1.210 +                          else
   1.211 +                            {
   1.212 +                              fprintf(fp, "%d*%s ", (int)val[i],
   1.213 +                                      glp_get_col_name(lp,ndx[i]));
   1.214 +                            }
   1.215 +                        }
   1.216 +                    }
   1.217 +                  switch(row_type)
   1.218 +                    {
   1.219 +                    case GLP_LO:
   1.220 +                      {
   1.221 +                        fprintf(fp, ">=");
   1.222 +                        bound = glp_get_row_lb(lp,j);
   1.223 +                        break;
   1.224 +                      }
   1.225 +                    case GLP_UP:
   1.226 +                      {
   1.227 +                        if(normalized)
   1.228 +                          {
   1.229 +                            fprintf(fp, ">=");
   1.230 +                            bound = -glp_get_row_ub(lp,j);
   1.231 +                          }
   1.232 +                        else
   1.233 +                          {
   1.234 +                            fprintf(fp, "<=");
   1.235 +                            bound = glp_get_row_ub(lp,j);
   1.236 +                          }
   1.237 +
   1.238 +                        break;
   1.239 +                      }
   1.240 +                    case GLP_FX:
   1.241 +                      {
   1.242 +                        fprintf(fp, "=");
   1.243 +                        bound = glp_get_row_lb(lp,j);
   1.244 +                        break;
   1.245 +                      }
   1.246 +                    }
   1.247 +                  fprintf(fp," %d;\n",(int)bound);
   1.248 +                }
   1.249 +            }
   1.250 +        }
   1.251 +      xfree(ndx);
   1.252 +      xfree(val);
   1.253 +
   1.254 +      if(constant)
   1.255 +        {
   1.256 +          xprintf(
   1.257 +        "lpx_write_pb: adding constant objective function variable\n");
   1.258 +
   1.259 +          if(normalized)
   1.260 +            fprintf(fp, "1 x%d = 1;\n", n+1);
   1.261 +          else
   1.262 +            fprintf(fp, "1*%s = 1;\n", objconstname);
   1.263 +        }
   1.264 +      if(emptylhs)
   1.265 +        {
   1.266 +          xprintf(
   1.267 +            "lpx_write_pb: adding dummy variable for empty left-hand si"
   1.268 +            "de constraint\n");
   1.269 +
   1.270 +          if(normalized)
   1.271 +            fprintf(fp, "1 x%d = 0;\n", n+2);
   1.272 +          else
   1.273 +            fprintf(fp, "1*%s = 0;\n", emptylhsname);
   1.274 +        }
   1.275 +
   1.276 +    }
   1.277 +  else
   1.278 +    {
   1.279 +      xprintf("Problems opening file for writing: %s\n", fname);
   1.280 +      return(1);
   1.281 +    }
   1.282 +  fflush(fp);
   1.283 +  if (ferror(fp))
   1.284 +    {  xprintf("lpx_write_pb: can't write to `%s' - %s\n", fname,
   1.285 +               strerror(errno));
   1.286 +    goto fail;
   1.287 +    }
   1.288 +  fclose(fp);
   1.289 +
   1.290 +
   1.291 +  if(binarize)
   1.292 +    {
   1.293 +      /* delete the resultant problem object */
   1.294 +      if (lp != NULL) lpx_delete_prob(lp);
   1.295 +      /* delete MIP presolver workspace */
   1.296 +      if (ipp != NULL) ipp_delete_wksp(ipp);
   1.297 +      /*lp=tlp;*/
   1.298 +    }
   1.299 +  return 0;
   1.300 + fail: if (fp != NULL) fclose(fp);
   1.301 +  return 1;
   1.302 +}
   1.303 +#endif
   1.304 +
   1.305 +/* eof */