[Lemon-commits] [lemon_svn] athos: r1688 - hugo/trunk/src/work/athos/lp

Lemon SVN svn at lemon.cs.elte.hu
Mon Nov 6 20:47:00 CET 2006


Author: athos
Date: Fri Mar 25 16:24:18 2005
New Revision: 1688

Added:
   hugo/trunk/src/work/athos/lp/lp_glpk.cc
   hugo/trunk/src/work/athos/lp/lp_glpk.h

Log:
Low level interface for GLPK (Marci után szabadon)

Added: hugo/trunk/src/work/athos/lp/lp_glpk.cc
==============================================================================
--- (empty file)
+++ hugo/trunk/src/work/athos/lp/lp_glpk.cc	Fri Mar 25 16:24:18 2005
@@ -0,0 +1,238 @@
+/* -*- C++ -*-
+ * src/lemon/lp_glpk.cc - Part of LEMON, a generic C++ optimization library
+ *
+ * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
+ * (Egervary Combinatorial Optimization Research Group, EGRES).
+ *
+ * Permission to use, modify and distribute this software is granted
+ * provided that this copyright notice appears in all copies. For
+ * precise terms see the accompanying LICENSE file.
+ *
+ * This software is provided "AS IS" with no warranty of any kind,
+ * express or implied, and with no claim as to its suitability for any
+ * purpose.
+ *
+ */
+
+#ifndef LEMON_LP_GLPK_CC
+#define LEMON_LP_GLPK_CC
+
+///\file
+///\brief Implementation of the LEMON-GLPK lp solver interface.
+
+#include "lp_glpk.h"
+
+namespace lemon {
+
+    /// \e
+    int LpGlpk::_addCol() { 
+	int i=lpx_add_cols(lp, 1);
+	_setColLowerBound(i, -INF);
+	_setColUpperBound(i, INF);
+	return i;
+    }
+
+    /// \e
+    int LpGlpk::_addRow() { 
+	int i=lpx_add_rows(lp, 1);
+	return i;
+    }
+
+  
+    void LpGlpk::_setRowCoeffs(int i, 
+			       int length,
+			       int   * indices, 
+			       Value   * values )
+    {
+	lpx_set_mat_row(lp, i, length, indices, values);
+    }
+  
+    void LpGlpk::_setColCoeffs(int i, 
+			       int length,
+			       int   * indices, 
+			       Value   * values)
+    {
+	lpx_set_mat_col(lp, i, length, indices, values);
+    }
+  
+    void LpGlpk::_setColLowerBound(int i, Value lo)
+    {
+      if (lo==INF) {
+	//FIXME error
+      }
+      int b=lpx_get_col_type(lp, i);
+      double up=lpx_get_col_ub(lp, i);	
+      if (lo==-INF) {
+	switch (b) {
+	case LPX_FR:
+	case LPX_LO:
+	  lpx_set_col_bnds(lp, i, LPX_FR, lo, up);
+	  break;
+	case LPX_UP:
+	  break;
+	case LPX_DB:
+	case LPX_FX:
+	  lpx_set_col_bnds(lp, i, LPX_UP, lo, up);
+	  break;
+	default: ;
+	  //FIXME error
+	}
+      } else {
+	switch (b) {
+	case LPX_FR:
+	case LPX_LO:
+	  lpx_set_col_bnds(lp, i, LPX_LO, lo, up);
+	  break;
+	case LPX_UP:	  
+	case LPX_DB:
+	case LPX_FX:
+	  if (lo==up) 
+	    lpx_set_col_bnds(lp, i, LPX_FX, lo, up);
+	  else 
+	    lpx_set_col_bnds(lp, i, LPX_DB, lo, up);
+	  break;
+	default: ;
+	  //FIXME error
+	}
+      }
+
+    }
+  
+    void LpGlpk::_setColUpperBound(int i, Value up)
+    {
+      if (up==-INF) {
+	//FIXME error
+      }
+      int b=lpx_get_col_type(lp, i);
+      double lo=lpx_get_col_lb(lp, i);
+      if (up==INF) {
+	switch (b) {
+	case LPX_FR:
+	case LPX_LO:
+	  break;
+	case LPX_UP:
+	  lpx_set_col_bnds(lp, i, LPX_FR, lo, up);
+	  break;
+	case LPX_DB:
+	case LPX_FX:
+	  lpx_set_col_bnds(lp, i, LPX_LO, lo, up);
+	  break;
+	default: ;
+	  //FIXME error
+	}
+      } else {
+	switch (b) {
+	case LPX_FR:
+	  lpx_set_col_bnds(lp, i, LPX_UP, lo, up);
+	  break;
+	case LPX_UP:
+	  lpx_set_col_bnds(lp, i, LPX_UP, lo, up);
+	  break;
+	case LPX_LO:
+	case LPX_DB:
+	case LPX_FX:
+	  if (lo==up) 
+	    lpx_set_col_bnds(lp, i, LPX_FX, lo, up);
+	  else 
+	    lpx_set_col_bnds(lp, i, LPX_DB, lo, up);
+	  break;
+	default: ;
+	  //FIXME error
+	}
+      }
+    }
+  
+    void LpGlpk::_setRowLowerBound(int i, Value lo)
+    {
+      if (lo==INF) {
+	//FIXME error
+      }
+      int b=lpx_get_row_type(lp, i);
+      double up=lpx_get_row_ub(lp, i);	
+      if (lo==-INF) {
+	switch (b) {
+	case LPX_FR:
+	case LPX_LO:
+	  lpx_set_row_bnds(lp, i, LPX_FR, lo, up);
+	  break;
+	case LPX_UP:
+	  break;
+	case LPX_DB:
+	case LPX_FX:
+	  lpx_set_row_bnds(lp, i, LPX_UP, lo, up);
+	  break;
+	default: ;
+	  //FIXME error
+	}
+      } else {
+	switch (b) {
+	case LPX_FR:
+	case LPX_LO:
+	  lpx_set_row_bnds(lp, i, LPX_LO, lo, up);
+	  break;
+	case LPX_UP:	  
+	case LPX_DB:
+	case LPX_FX:
+	  if (lo==up) 
+	    lpx_set_row_bnds(lp, i, LPX_FX, lo, up);
+	  else 
+	    lpx_set_row_bnds(lp, i, LPX_DB, lo, up);
+	  break;
+	default: ;
+	  //FIXME error
+	}
+      }
+    }
+  
+    void LpGlpk::_setRowUpperBound(int i, Value up)
+    {
+      if (up==-INF) {
+	//FIXME error
+      }
+      int b=lpx_get_row_type(lp, i);
+      double lo=lpx_get_row_lb(lp, i);
+      if (up==INF) {
+	switch (b) {
+	case LPX_FR:
+	case LPX_LO:
+	  break;
+	case LPX_UP:
+	  lpx_set_row_bnds(lp, i, LPX_FR, lo, up);
+	  break;
+	case LPX_DB:
+	case LPX_FX:
+	  lpx_set_row_bnds(lp, i, LPX_LO, lo, up);
+	  break;
+	default: ;
+	  //FIXME error
+	}
+      } else {
+	switch (b) {
+	case LPX_FR:
+	  lpx_set_row_bnds(lp, i, LPX_UP, lo, up);
+	  break;
+	case LPX_UP:
+	  lpx_set_row_bnds(lp, i, LPX_UP, lo, up);
+	  break;
+	case LPX_LO:
+	case LPX_DB:
+	case LPX_FX:
+	  if (lo==up) 
+	    lpx_set_row_bnds(lp, i, LPX_FX, lo, up);
+	  else 
+	    lpx_set_row_bnds(lp, i, LPX_DB, lo, up);
+	  break;
+	default: ;
+	  //FIXME error
+	}
+      }
+    }
+  
+    void LpGlpk::_setObjCoeff(int i, Value obj_coef)
+    {
+      lpx_set_obj_coef(lp, i, obj_coef);
+    }
+
+} //END OF NAMESPACE LEMON
+
+#endif //LEMON_LP_GLPK_CC

Added: hugo/trunk/src/work/athos/lp/lp_glpk.h
==============================================================================
--- (empty file)
+++ hugo/trunk/src/work/athos/lp/lp_glpk.h	Fri Mar 25 16:24:18 2005
@@ -0,0 +1,74 @@
+/* -*- C++ -*-
+ * src/lemon/lp_glpk.h - Part of LEMON, a generic C++ optimization library
+ *
+ * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
+ * (Egervary Combinatorial Optimization Research Group, EGRES).
+ *
+ * Permission to use, modify and distribute this software is granted
+ * provided that this copyright notice appears in all copies. For
+ * precise terms see the accompanying LICENSE file.
+ *
+ * This software is provided "AS IS" with no warranty of any kind,
+ * express or implied, and with no claim as to its suitability for any
+ * purpose.
+ *
+ */
+
+#ifndef LEMON_LP_GLPK_H
+#define LEMON_LP_GLPK_H
+
+///\file
+///\brief Header of the LEMON-GLPK lp solver interface.
+
+#include "lp_base.h"
+extern "C" {
+#include "glpk.h"
+}
+
+namespace lemon {
+
+
+  /// \brief Wrapper for GLPK solver
+  /// 
+  /// This class implements a lemon wrapper for GLPK.
+  class LpGlpk : public LpSolverBase {
+
+  public:
+
+    typedef LpSolverBase Parent;
+    
+    /// \e
+    LPX* lp;
+
+    /// \e
+    LpGlpk() : Parent(), 
+			lp(lpx_create_prob()) {
+      lpx_set_int_parm(lp, LPX_K_DUAL, 1);
+    }
+    /// \e
+    ~LpGlpk() {
+      lpx_delete_prob(lp);
+    }
+
+  protected:
+    virtual int _addCol();
+    virtual int _addRow();
+    virtual void _setRowCoeffs(int i, 
+			       int length,
+                               int   * indices, 
+                               Value   * values );
+    virtual void _setColCoeffs(int i, 
+			       int length,
+                               int   * indices, 
+                               Value   * values);
+    virtual void _setColLowerBound(int i, Value value);
+    virtual void _setColUpperBound(int i, Value value);
+    virtual void _setRowLowerBound(int i, Value value);
+    virtual void _setRowUpperBound(int i, Value value);
+    virtual void _setObjCoeff(int i, Value obj_coef);
+
+  };
+} //END OF NAMESPACE LEMON
+
+#endif //LEMON_LP_GLPK_H
+



More information about the Lemon-commits mailing list