test/mip_test.cc
author deba
Wed, 06 Sep 2006 10:01:15 +0000
changeset 2200 2f2ac1b1ca1e
parent 2147 63d293ff1bef
child 2213 2c094dfa176d
permissions -rw-r--r--
An easy avoiding of a bug

The functional interfaces are removed.
Better solution could be a reference counted core of the io interfaces

Now it is huge work so just write that:

GraphReader<ListGraph>(std::cin, graph).

Instead of:

graphReader(std::cin, graph).
     1 #include <lemon/lp.h>
     2 #include "test_tools.h"
     3 
     4 using namespace lemon;
     5 
     6 void solveAndCheck(Mip& lp, LpSolverBase::SolutionStatus stat, 
     7 		   double exp_opt) {
     8   using std::string;
     9   lp.solve();
    10   //int decimal,sign;
    11   std::ostringstream buf;
    12   buf << "Primalstatus should be: " << int(stat)<<" and it is "<<int(lp.primalStatus());
    13 
    14   //  itoa(stat,buf1, 10);
    15   check(lp.primalStatus()==stat, buf.str());
    16 
    17   if (stat ==  LpSolverBase::OPTIMAL) {
    18     std::ostringstream buf;
    19     buf << "Wrong optimal value: the right optimum is " << exp_opt; 
    20     check(std::abs(lp.primalValue()-exp_opt) < 1e-3, buf.str());
    21     //+ecvt(exp_opt,2)
    22   }
    23 }
    24 
    25 void aTest(Mip& mip)
    26 {
    27  //The following example is very simple
    28 
    29   typedef Mip::Row Row;
    30   typedef Mip::Col Col;
    31 
    32 
    33   Col x1 = mip.addCol();
    34   Col x2 = mip.addCol();
    35 
    36 
    37 
    38   //Constraints
    39   mip.addRow(2*x1+x2 <=2);  
    40   mip.addRow(x1-2*x2 <=0);  
    41 
    42   //Nonnegativity of the variable x1
    43   mip.colLowerBound(x1, 0);
    44 
    45 
    46 
    47   //Objective function
    48   mip.setObj(x1);
    49 
    50   mip.max();
    51 
    52 
    53   //Maximization of x1
    54   //over the triangle with vertices
    55   double expected_opt=4.0/5.0;
    56   solveAndCheck(mip, Mip::OPTIMAL, expected_opt);
    57 
    58   //Restrict x2 to integer
    59   mip.colType(x2,Mip::INTEGER);  
    60   expected_opt=1.0/2.0;
    61   solveAndCheck(mip, Mip::OPTIMAL, expected_opt);
    62 
    63 
    64   //Restrict both to integer
    65   mip.colType(x1,Mip::INTEGER);  
    66   expected_opt=0;
    67   solveAndCheck(mip, Mip::OPTIMAL, expected_opt);
    68 
    69  
    70 
    71 }
    72 
    73 
    74 int main() 
    75 {
    76 
    77 #ifdef HAVE_GLPK
    78   MipGlpk mip1;
    79   aTest(mip1);
    80 #endif
    81 
    82   return 0;
    83 
    84 }