src/work/marci/lp/lp_solver_base.h
changeset 1143 4fb22cfa5759
parent 1113 b5ad821053a1
child 1144 1cfabf245433
     1.1 --- a/src/work/marci/lp/lp_solver_base.h	Tue Feb 08 11:27:03 2005 +0000
     1.2 +++ b/src/work/marci/lp/lp_solver_base.h	Tue Feb 08 17:47:19 2005 +0000
     1.3 @@ -171,6 +171,7 @@
     1.4  
     1.5  
     1.6    /*! \e
     1.7 +    \todo kellenene uj iterable structure bele, mert ez nem az igazi
     1.8      \todo A[x,y]-t cserel. Jobboldal, baloldal csere.
     1.9      \todo LEKERDEZESEK!!!
    1.10      \todo DOKSI!!!! Doxygen group!!!
    1.11 @@ -201,6 +202,10 @@
    1.12      /// \e
    1.13      IterablePartition<int> col_iter_map;
    1.14      /// \e
    1.15 +    std::vector<RowIt> int_row_map;
    1.16 +    /// \e
    1.17 +    std::vector<ColIt> int_col_map;
    1.18 +    /// \e
    1.19      const int VALID_CLASS;
    1.20      /// \e
    1.21      const int INVALID_CLASS;
    1.22 @@ -297,8 +302,15 @@
    1.23      virtual void _setRowCoeffs(int i, 
    1.24  			       const std::vector<std::pair<int, _Value> >& coeffs) = 0;
    1.25      /// \e
    1.26 +    /// This routine modifies \c coeffs only by the \c push_back method.
    1.27 +    virtual void _getRowCoeffs(int i, 
    1.28 +			       std::vector<std::pair<int, _Value> >& coeffs) = 0;
    1.29      virtual void _setColCoeffs(int i, 
    1.30  			       const std::vector<std::pair<int, _Value> >& coeffs) = 0;
    1.31 +    /// \e
    1.32 +    /// This routine modifies \c coeffs only by the \c push_back method.
    1.33 +    virtual void _getColCoeffs(int i, 
    1.34 +			       std::vector<std::pair<int, _Value> >& coeffs) = 0;
    1.35    public:
    1.36      /// \e
    1.37      enum Bound { FREE, LOWER, UPPER, DOUBLE, FIXED };
    1.38 @@ -373,6 +385,7 @@
    1.39        } else { //a cucc vegere kell inzertalni mert nincs szabad hely
    1.40  	col_it=col_iter_map.push_back(i, VALID_CLASS);
    1.41        }
    1.42 +      int_col_map.push_back(col_it);
    1.43        return col_it;
    1.44      }
    1.45      /// \e
    1.46 @@ -386,6 +399,7 @@
    1.47        } else { //a cucc vegere kell inzertalni mert nincs szabad hely
    1.48  	row_it=row_iter_map.push_back(i, VALID_CLASS);
    1.49        }
    1.50 +      int_row_map.push_back(row_it);
    1.51        return row_it;
    1.52      }
    1.53      /// \e
    1.54 @@ -400,6 +414,7 @@
    1.55  	   col_iter_map.valid(it); col_iter_map.next(it)) {
    1.56  	if (col_iter_map[it]>cols[1]) --col_iter_map[it];
    1.57        }
    1.58 +      int_col_map.erase(int_col_map.begin()+cols[1]);
    1.59      }
    1.60      /// \e
    1.61      void eraseRow(const RowIt& row_it) {
    1.62 @@ -413,6 +428,7 @@
    1.63  	   row_iter_map.valid(it); row_iter_map.next(it)) {
    1.64  	if (row_iter_map[it]>rows[1]) --row_iter_map[it];
    1.65        }
    1.66 +      int_row_map.erase(int_row_map.begin()+rows[1]);
    1.67      }
    1.68      /// \e
    1.69      template <typename Begin, typename End>
    1.70 @@ -509,6 +525,16 @@
    1.71        _setRowCoeffs(row_iter_map[row_it], row_coeffs);
    1.72      }
    1.73      /// \e
    1.74 +    /// This routine modifies \c expr by only adding to it.
    1.75 +    void getRowCoeffs(RowIt row_it, Expression& expr) {
    1.76 +      std::vector<std::pair<int, _Value> > row_coeffs;
    1.77 +      _getRowCoeffs(row_iter_map[row_it], row_coeffs);
    1.78 +      for(typename std::vector<std::pair<int, _Value> >::const_iterator 
    1.79 + 	    i=row_coeffs.begin(); i!=row_coeffs.end(); ++i) {
    1.80 + 	expr+= (*i).second*int_col_map[(*i).first];
    1.81 +      }
    1.82 +    }
    1.83 +    /// \e
    1.84      void setColCoeffs(ColIt col_it, const DualExpression& expr) {
    1.85        std::vector<std::pair<int, _Value> > col_coeffs;
    1.86        for(typename DualExpression::Data::const_iterator i=expr.data.begin(); 
    1.87 @@ -519,12 +545,28 @@
    1.88        _setColCoeffs(col_iter_map[col_it], col_coeffs);
    1.89      }
    1.90      /// \e
    1.91 +    /// This routine modifies \c expr by only adding to it.
    1.92 +    void getColCoeffs(ColIt col_it, DualExpression& expr) {
    1.93 +      std::vector<std::pair<int, _Value> > col_coeffs;
    1.94 +      _getColCoeffs(col_iter_map[col_it], col_coeffs);
    1.95 +      for(typename std::vector<std::pair<int, _Value> >::const_iterator 
    1.96 + 	    i=col_coeffs.begin(); i!=col_coeffs.end(); ++i) {
    1.97 + 	expr+= (*i).second*int_row_map[(*i).first];
    1.98 +      }
    1.99 +    }
   1.100 +    /// \e
   1.101 +    /// \bug ez igy nem jo
   1.102      void setObjCoeffs(const Expression& expr) {
   1.103        for(typename Expression::Data::const_iterator i=expr.data.begin(); 
   1.104  	  i!=expr.data.end(); ++i) {
   1.105  	setObjCoef((*i).first, (*i).second);
   1.106        }
   1.107      }
   1.108 +    /// \e
   1.109 +    /// This routine modifies \c expr by only adding to it.
   1.110 +    void getObjCoeffs(Expression& expr) {
   1.111 +      /// FIXME not yet implemented
   1.112 +    }
   1.113      //@}
   1.114    };
   1.115    
   1.116 @@ -547,6 +589,8 @@
   1.117      /// \e
   1.118      LPGLPK() : Parent(), 
   1.119  			lp(lpx_create_prob()) {
   1.120 +      int_row_map.push_back(RowIt());
   1.121 +      int_col_map.push_back(ColIt());
   1.122        lpx_set_int_parm(lp, LPX_K_DUAL, 1);
   1.123      }
   1.124      /// \e
   1.125 @@ -592,15 +636,25 @@
   1.126  	++length;
   1.127  	indices[length]=it->first;
   1.128  	doubles[length]=it->second;
   1.129 -// 	std::cout << "  " << indices[length] << " " 
   1.130 -// 		  << doubles[length] << std::endl;
   1.131        }
   1.132 -//      std::cout << i << " " << length << std::endl;
   1.133        lpx_set_mat_row(lp, i, length, indices, doubles);
   1.134        delete [] indices;
   1.135        delete [] doubles;
   1.136      }
   1.137      /// \e
   1.138 +    virtual void _getRowCoeffs(int i, 
   1.139 +			       std::vector<std::pair<int, double> >& coeffs) {
   1.140 +      int mem_length=1+colNum();
   1.141 +      int* indices = new int[mem_length];
   1.142 +      double* doubles = new double[mem_length];
   1.143 +      int length=lpx_get_mat_row(lp, i, indices, doubles);
   1.144 +      for (int i=1; i<=length; ++i) {
   1.145 +	coeffs.push_back(std::make_pair(indices[i], doubles[i]));
   1.146 +      }
   1.147 +      delete [] indices;
   1.148 +      delete [] doubles;
   1.149 +    }
   1.150 +    /// \e
   1.151      virtual void _setColCoeffs(int i, 
   1.152  			       const std::vector<std::pair<int, double> >& coeffs) {
   1.153        int mem_length=1+rowNum();
   1.154 @@ -618,6 +672,19 @@
   1.155        delete [] doubles;
   1.156      }
   1.157      /// \e
   1.158 +    virtual void _getColCoeffs(int i, 
   1.159 +			       std::vector<std::pair<int, double> >& coeffs) {
   1.160 +      int mem_length=1+rowNum();
   1.161 +      int* indices = new int[mem_length];
   1.162 +      double* doubles = new double[mem_length];
   1.163 +      int length=lpx_get_mat_col(lp, i, indices, doubles);
   1.164 +      for (int i=1; i<=length; ++i) {
   1.165 +	coeffs.push_back(std::make_pair(indices[i], doubles[i]));
   1.166 +      }
   1.167 +      delete [] indices;
   1.168 +      delete [] doubles;
   1.169 +    }
   1.170 +    /// \e
   1.171      virtual void _eraseCol(int i) {
   1.172        int cols[2];
   1.173        cols[1]=i;