src/work/athos/lp/lp_glpk.cc
author athos
Fri, 25 Mar 2005 15:24:18 +0000
changeset 1261 9d0deeea8c08
child 1263 a490938ad0aa
permissions -rw-r--r--
Low level interface for GLPK (Marci ut?n szabadon)
athos@1261
     1
/* -*- C++ -*-
athos@1261
     2
 * src/lemon/lp_glpk.cc - Part of LEMON, a generic C++ optimization library
athos@1261
     3
 *
athos@1261
     4
 * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
athos@1261
     5
 * (Egervary Combinatorial Optimization Research Group, EGRES).
athos@1261
     6
 *
athos@1261
     7
 * Permission to use, modify and distribute this software is granted
athos@1261
     8
 * provided that this copyright notice appears in all copies. For
athos@1261
     9
 * precise terms see the accompanying LICENSE file.
athos@1261
    10
 *
athos@1261
    11
 * This software is provided "AS IS" with no warranty of any kind,
athos@1261
    12
 * express or implied, and with no claim as to its suitability for any
athos@1261
    13
 * purpose.
athos@1261
    14
 *
athos@1261
    15
 */
athos@1261
    16
athos@1261
    17
#ifndef LEMON_LP_GLPK_CC
athos@1261
    18
#define LEMON_LP_GLPK_CC
athos@1261
    19
athos@1261
    20
///\file
athos@1261
    21
///\brief Implementation of the LEMON-GLPK lp solver interface.
athos@1261
    22
athos@1261
    23
#include "lp_glpk.h"
athos@1261
    24
athos@1261
    25
namespace lemon {
athos@1261
    26
athos@1261
    27
    /// \e
athos@1261
    28
    int LpGlpk::_addCol() { 
athos@1261
    29
	int i=lpx_add_cols(lp, 1);
athos@1261
    30
	_setColLowerBound(i, -INF);
athos@1261
    31
	_setColUpperBound(i, INF);
athos@1261
    32
	return i;
athos@1261
    33
    }
athos@1261
    34
athos@1261
    35
    /// \e
athos@1261
    36
    int LpGlpk::_addRow() { 
athos@1261
    37
	int i=lpx_add_rows(lp, 1);
athos@1261
    38
	return i;
athos@1261
    39
    }
athos@1261
    40
athos@1261
    41
  
athos@1261
    42
    void LpGlpk::_setRowCoeffs(int i, 
athos@1261
    43
			       int length,
athos@1261
    44
			       int   * indices, 
athos@1261
    45
			       Value   * values )
athos@1261
    46
    {
athos@1261
    47
	lpx_set_mat_row(lp, i, length, indices, values);
athos@1261
    48
    }
athos@1261
    49
  
athos@1261
    50
    void LpGlpk::_setColCoeffs(int i, 
athos@1261
    51
			       int length,
athos@1261
    52
			       int   * indices, 
athos@1261
    53
			       Value   * values)
athos@1261
    54
    {
athos@1261
    55
	lpx_set_mat_col(lp, i, length, indices, values);
athos@1261
    56
    }
athos@1261
    57
  
athos@1261
    58
    void LpGlpk::_setColLowerBound(int i, Value lo)
athos@1261
    59
    {
athos@1261
    60
      if (lo==INF) {
athos@1261
    61
	//FIXME error
athos@1261
    62
      }
athos@1261
    63
      int b=lpx_get_col_type(lp, i);
athos@1261
    64
      double up=lpx_get_col_ub(lp, i);	
athos@1261
    65
      if (lo==-INF) {
athos@1261
    66
	switch (b) {
athos@1261
    67
	case LPX_FR:
athos@1261
    68
	case LPX_LO:
athos@1261
    69
	  lpx_set_col_bnds(lp, i, LPX_FR, lo, up);
athos@1261
    70
	  break;
athos@1261
    71
	case LPX_UP:
athos@1261
    72
	  break;
athos@1261
    73
	case LPX_DB:
athos@1261
    74
	case LPX_FX:
athos@1261
    75
	  lpx_set_col_bnds(lp, i, LPX_UP, lo, up);
athos@1261
    76
	  break;
athos@1261
    77
	default: ;
athos@1261
    78
	  //FIXME error
athos@1261
    79
	}
athos@1261
    80
      } else {
athos@1261
    81
	switch (b) {
athos@1261
    82
	case LPX_FR:
athos@1261
    83
	case LPX_LO:
athos@1261
    84
	  lpx_set_col_bnds(lp, i, LPX_LO, lo, up);
athos@1261
    85
	  break;
athos@1261
    86
	case LPX_UP:	  
athos@1261
    87
	case LPX_DB:
athos@1261
    88
	case LPX_FX:
athos@1261
    89
	  if (lo==up) 
athos@1261
    90
	    lpx_set_col_bnds(lp, i, LPX_FX, lo, up);
athos@1261
    91
	  else 
athos@1261
    92
	    lpx_set_col_bnds(lp, i, LPX_DB, lo, up);
athos@1261
    93
	  break;
athos@1261
    94
	default: ;
athos@1261
    95
	  //FIXME error
athos@1261
    96
	}
athos@1261
    97
      }
athos@1261
    98
athos@1261
    99
    }
athos@1261
   100
  
athos@1261
   101
    void LpGlpk::_setColUpperBound(int i, Value up)
athos@1261
   102
    {
athos@1261
   103
      if (up==-INF) {
athos@1261
   104
	//FIXME error
athos@1261
   105
      }
athos@1261
   106
      int b=lpx_get_col_type(lp, i);
athos@1261
   107
      double lo=lpx_get_col_lb(lp, i);
athos@1261
   108
      if (up==INF) {
athos@1261
   109
	switch (b) {
athos@1261
   110
	case LPX_FR:
athos@1261
   111
	case LPX_LO:
athos@1261
   112
	  break;
athos@1261
   113
	case LPX_UP:
athos@1261
   114
	  lpx_set_col_bnds(lp, i, LPX_FR, lo, up);
athos@1261
   115
	  break;
athos@1261
   116
	case LPX_DB:
athos@1261
   117
	case LPX_FX:
athos@1261
   118
	  lpx_set_col_bnds(lp, i, LPX_LO, lo, up);
athos@1261
   119
	  break;
athos@1261
   120
	default: ;
athos@1261
   121
	  //FIXME error
athos@1261
   122
	}
athos@1261
   123
      } else {
athos@1261
   124
	switch (b) {
athos@1261
   125
	case LPX_FR:
athos@1261
   126
	  lpx_set_col_bnds(lp, i, LPX_UP, lo, up);
athos@1261
   127
	  break;
athos@1261
   128
	case LPX_UP:
athos@1261
   129
	  lpx_set_col_bnds(lp, i, LPX_UP, lo, up);
athos@1261
   130
	  break;
athos@1261
   131
	case LPX_LO:
athos@1261
   132
	case LPX_DB:
athos@1261
   133
	case LPX_FX:
athos@1261
   134
	  if (lo==up) 
athos@1261
   135
	    lpx_set_col_bnds(lp, i, LPX_FX, lo, up);
athos@1261
   136
	  else 
athos@1261
   137
	    lpx_set_col_bnds(lp, i, LPX_DB, lo, up);
athos@1261
   138
	  break;
athos@1261
   139
	default: ;
athos@1261
   140
	  //FIXME error
athos@1261
   141
	}
athos@1261
   142
      }
athos@1261
   143
    }
athos@1261
   144
  
athos@1261
   145
    void LpGlpk::_setRowLowerBound(int i, Value lo)
athos@1261
   146
    {
athos@1261
   147
      if (lo==INF) {
athos@1261
   148
	//FIXME error
athos@1261
   149
      }
athos@1261
   150
      int b=lpx_get_row_type(lp, i);
athos@1261
   151
      double up=lpx_get_row_ub(lp, i);	
athos@1261
   152
      if (lo==-INF) {
athos@1261
   153
	switch (b) {
athos@1261
   154
	case LPX_FR:
athos@1261
   155
	case LPX_LO:
athos@1261
   156
	  lpx_set_row_bnds(lp, i, LPX_FR, lo, up);
athos@1261
   157
	  break;
athos@1261
   158
	case LPX_UP:
athos@1261
   159
	  break;
athos@1261
   160
	case LPX_DB:
athos@1261
   161
	case LPX_FX:
athos@1261
   162
	  lpx_set_row_bnds(lp, i, LPX_UP, lo, up);
athos@1261
   163
	  break;
athos@1261
   164
	default: ;
athos@1261
   165
	  //FIXME error
athos@1261
   166
	}
athos@1261
   167
      } else {
athos@1261
   168
	switch (b) {
athos@1261
   169
	case LPX_FR:
athos@1261
   170
	case LPX_LO:
athos@1261
   171
	  lpx_set_row_bnds(lp, i, LPX_LO, lo, up);
athos@1261
   172
	  break;
athos@1261
   173
	case LPX_UP:	  
athos@1261
   174
	case LPX_DB:
athos@1261
   175
	case LPX_FX:
athos@1261
   176
	  if (lo==up) 
athos@1261
   177
	    lpx_set_row_bnds(lp, i, LPX_FX, lo, up);
athos@1261
   178
	  else 
athos@1261
   179
	    lpx_set_row_bnds(lp, i, LPX_DB, lo, up);
athos@1261
   180
	  break;
athos@1261
   181
	default: ;
athos@1261
   182
	  //FIXME error
athos@1261
   183
	}
athos@1261
   184
      }
athos@1261
   185
    }
athos@1261
   186
  
athos@1261
   187
    void LpGlpk::_setRowUpperBound(int i, Value up)
athos@1261
   188
    {
athos@1261
   189
      if (up==-INF) {
athos@1261
   190
	//FIXME error
athos@1261
   191
      }
athos@1261
   192
      int b=lpx_get_row_type(lp, i);
athos@1261
   193
      double lo=lpx_get_row_lb(lp, i);
athos@1261
   194
      if (up==INF) {
athos@1261
   195
	switch (b) {
athos@1261
   196
	case LPX_FR:
athos@1261
   197
	case LPX_LO:
athos@1261
   198
	  break;
athos@1261
   199
	case LPX_UP:
athos@1261
   200
	  lpx_set_row_bnds(lp, i, LPX_FR, lo, up);
athos@1261
   201
	  break;
athos@1261
   202
	case LPX_DB:
athos@1261
   203
	case LPX_FX:
athos@1261
   204
	  lpx_set_row_bnds(lp, i, LPX_LO, lo, up);
athos@1261
   205
	  break;
athos@1261
   206
	default: ;
athos@1261
   207
	  //FIXME error
athos@1261
   208
	}
athos@1261
   209
      } else {
athos@1261
   210
	switch (b) {
athos@1261
   211
	case LPX_FR:
athos@1261
   212
	  lpx_set_row_bnds(lp, i, LPX_UP, lo, up);
athos@1261
   213
	  break;
athos@1261
   214
	case LPX_UP:
athos@1261
   215
	  lpx_set_row_bnds(lp, i, LPX_UP, lo, up);
athos@1261
   216
	  break;
athos@1261
   217
	case LPX_LO:
athos@1261
   218
	case LPX_DB:
athos@1261
   219
	case LPX_FX:
athos@1261
   220
	  if (lo==up) 
athos@1261
   221
	    lpx_set_row_bnds(lp, i, LPX_FX, lo, up);
athos@1261
   222
	  else 
athos@1261
   223
	    lpx_set_row_bnds(lp, i, LPX_DB, lo, up);
athos@1261
   224
	  break;
athos@1261
   225
	default: ;
athos@1261
   226
	  //FIXME error
athos@1261
   227
	}
athos@1261
   228
      }
athos@1261
   229
    }
athos@1261
   230
  
athos@1261
   231
    void LpGlpk::_setObjCoeff(int i, Value obj_coef)
athos@1261
   232
    {
athos@1261
   233
      lpx_set_obj_coef(lp, i, obj_coef);
athos@1261
   234
    }
athos@1261
   235
athos@1261
   236
} //END OF NAMESPACE LEMON
athos@1261
   237
athos@1261
   238
#endif //LEMON_LP_GLPK_CC