22 #include <lemon/lp_glpk.h> |
22 #include <lemon/lp_glpk.h> |
23 //#include <iostream> |
23 //#include <iostream> |
24 namespace lemon { |
24 namespace lemon { |
25 |
25 |
26 |
26 |
27 LpGlpk::LpGlpk() : Parent(), |
27 LpGlpk::LpGlpk() : Parent() { |
28 lp(lpx_create_prob()) { |
28 rows = _lp_bits::LpId(1); |
29 ///\todo constrol function for this: |
29 cols = _lp_bits::LpId(1); |
|
30 lp = lpx_create_prob(); |
|
31 ///\todo control function for this: |
30 lpx_set_int_parm(lp, LPX_K_DUAL, 1); |
32 lpx_set_int_parm(lp, LPX_K_DUAL, 1); |
31 messageLevel(0); |
33 messageLevel(0); |
32 } |
34 } |
33 |
35 |
34 LpGlpk::LpGlpk(const LpGlpk &glp) : Parent(glp), |
36 LpGlpk::LpGlpk(const LpGlpk &glp) : Parent() { |
35 lp(lpx_create_prob()) { |
37 rows = _lp_bits::LpId(1); |
36 ///\todo constrol function for this: |
38 cols = _lp_bits::LpId(1); |
|
39 lp = lpx_create_prob(); |
|
40 ///\todo control function for this: |
37 lpx_set_int_parm(lp, LPX_K_DUAL, 1); |
41 lpx_set_int_parm(lp, LPX_K_DUAL, 1); |
38 messageLevel(0); |
42 messageLevel(0); |
39 //Coefficient matrix, row bounds |
43 //Coefficient matrix, row bounds |
40 lpx_add_rows(lp, lpx_get_num_rows(glp.lp)); |
44 lpx_add_rows(lp, lpx_get_num_rows(glp.lp)); |
41 lpx_add_cols(lp, lpx_get_num_cols(glp.lp)); |
45 lpx_add_cols(lp, lpx_get_num_cols(glp.lp)); |
347 default: ; |
351 default: ; |
348 return INF; |
352 return INF; |
349 } |
353 } |
350 } |
354 } |
351 |
355 |
352 // void LpGlpk::_setRowLowerBound(int i, Value lo) |
|
353 // { |
|
354 // if (lo==INF) { |
|
355 // //FIXME error |
|
356 // } |
|
357 // int b=lpx_get_row_type(lp, i); |
|
358 // double up=lpx_get_row_ub(lp, i); |
|
359 // if (lo==-INF) { |
|
360 // switch (b) { |
|
361 // case LPX_FR: |
|
362 // case LPX_LO: |
|
363 // lpx_set_row_bnds(lp, i, LPX_FR, lo, up); |
|
364 // break; |
|
365 // case LPX_UP: |
|
366 // break; |
|
367 // case LPX_DB: |
|
368 // case LPX_FX: |
|
369 // lpx_set_row_bnds(lp, i, LPX_UP, lo, up); |
|
370 // break; |
|
371 // default: ; |
|
372 // //FIXME error |
|
373 // } |
|
374 // } else { |
|
375 // switch (b) { |
|
376 // case LPX_FR: |
|
377 // case LPX_LO: |
|
378 // lpx_set_row_bnds(lp, i, LPX_LO, lo, up); |
|
379 // break; |
|
380 // case LPX_UP: |
|
381 // case LPX_DB: |
|
382 // case LPX_FX: |
|
383 // if (lo==up) |
|
384 // lpx_set_row_bnds(lp, i, LPX_FX, lo, up); |
|
385 // else |
|
386 // lpx_set_row_bnds(lp, i, LPX_DB, lo, up); |
|
387 // break; |
|
388 // default: ; |
|
389 // //FIXME error |
|
390 // } |
|
391 // } |
|
392 // } |
|
393 |
|
394 // void LpGlpk::_setRowUpperBound(int i, Value up) |
|
395 // { |
|
396 // if (up==-INF) { |
|
397 // //FIXME error |
|
398 // } |
|
399 // int b=lpx_get_row_type(lp, i); |
|
400 // double lo=lpx_get_row_lb(lp, i); |
|
401 // if (up==INF) { |
|
402 // switch (b) { |
|
403 // case LPX_FR: |
|
404 // case LPX_LO: |
|
405 // break; |
|
406 // case LPX_UP: |
|
407 // lpx_set_row_bnds(lp, i, LPX_FR, lo, up); |
|
408 // break; |
|
409 // case LPX_DB: |
|
410 // case LPX_FX: |
|
411 // lpx_set_row_bnds(lp, i, LPX_LO, lo, up); |
|
412 // break; |
|
413 // default: ; |
|
414 // //FIXME error |
|
415 // } |
|
416 // } else { |
|
417 // switch (b) { |
|
418 // case LPX_FR: |
|
419 // lpx_set_row_bnds(lp, i, LPX_UP, lo, up); |
|
420 // break; |
|
421 // case LPX_UP: |
|
422 // lpx_set_row_bnds(lp, i, LPX_UP, lo, up); |
|
423 // break; |
|
424 // case LPX_LO: |
|
425 // case LPX_DB: |
|
426 // case LPX_FX: |
|
427 // if (lo==up) |
|
428 // lpx_set_row_bnds(lp, i, LPX_FX, lo, up); |
|
429 // else |
|
430 // lpx_set_row_bnds(lp, i, LPX_DB, lo, up); |
|
431 // break; |
|
432 // default: ; |
|
433 // //FIXME error |
|
434 // } |
|
435 // } |
|
436 // } |
|
437 |
|
438 void LpGlpk::_setRowBounds(int i, Value lb, Value ub) |
356 void LpGlpk::_setRowBounds(int i, Value lb, Value ub) |
439 { |
357 { |
440 //Bad parameter |
358 //Bad parameter |
441 if (lb==INF || ub==-INF) { |
359 if (lb==INF || ub==-INF) { |
442 //FIXME error |
360 //FIXME error |
506 { |
424 { |
507 for (int i=0;i<=lpx_get_num_cols(lp);++i){ |
425 for (int i=0;i<=lpx_get_num_cols(lp);++i){ |
508 lpx_set_obj_coef(lp, i, 0); |
426 lpx_set_obj_coef(lp, i, 0); |
509 } |
427 } |
510 } |
428 } |
511 // void LpGlpk::_setObj(int length, |
|
512 // int const * indices, |
|
513 // Value const * values ) |
|
514 // { |
|
515 // Value new_values[1+lpx_num_cols()]; |
|
516 // for (i=0;i<=lpx_num_cols();++i){ |
|
517 // new_values[i]=0; |
|
518 // } |
|
519 // for (i=1;i<=length;++i){ |
|
520 // new_values[indices[i]]=values[i]; |
|
521 // } |
|
522 |
|
523 // for (i=0;i<=lpx_num_cols();++i){ |
|
524 // lpx_set_obj_coef(lp, i, new_values[i]); |
|
525 // } |
|
526 // } |
|
527 |
429 |
528 LpGlpk::SolveExitStatus LpGlpk::_solve() |
430 LpGlpk::SolveExitStatus LpGlpk::_solve() |
529 { |
431 { |
530 // A way to check the problem to be solved |
432 // A way to check the problem to be solved |
531 //lpx_write_cpxlp(lp,"naittvan.cpx"); |
433 //lpx_write_cpxlp(lp,"naittvan.cpx"); |
532 |
434 |
|
435 lpx_std_basis(lp); |
533 int i = lpx_simplex(lp); |
436 int i = lpx_simplex(lp); |
|
437 |
534 switch (i) { |
438 switch (i) { |
535 case LPX_E_OK: |
439 case LPX_E_OK: |
536 return SOLVED; |
440 return SOLVED; |
537 default: |
441 default: |
538 return UNSOLVED; |
442 return UNSOLVED; |