gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Change LEMON's isnan() to isNaN() for the sake of AIX/xlC Certain xlC versions implement isnan() as a #define.
0 2 0
default
2 files changed with 7 insertions and 7 deletions:
↑ Collapse diff ↑
Ignore white space 384 line context
... ...
@@ -408,389 +408,389 @@
408 408
        return *this;
409 409
      }
410 410
      ///Compound assignment
411 411
      Expr &operator-=(const Expr &e) {
412 412
        for (std::map<int, Value>::const_iterator it=e.comps.begin();
413 413
             it!=e.comps.end(); ++it)
414 414
          comps[it->first]-=it->second;
415 415
        const_comp-=e.const_comp;
416 416
        return *this;
417 417
      }
418 418
      ///Multiply with a constant
419 419
      Expr &operator*=(const Value &v) {
420 420
        for (std::map<int, Value>::iterator it=comps.begin();
421 421
             it!=comps.end(); ++it)
422 422
          it->second*=v;
423 423
        const_comp*=v;
424 424
        return *this;
425 425
      }
426 426
      ///Division with a constant
427 427
      Expr &operator/=(const Value &c) {
428 428
        for (std::map<int, Value>::iterator it=comps.begin();
429 429
             it!=comps.end(); ++it)
430 430
          it->second/=c;
431 431
        const_comp/=c;
432 432
        return *this;
433 433
      }
434 434

	
435 435
      ///Iterator over the expression
436 436
      
437 437
      ///The iterator iterates over the terms of the expression. 
438 438
      /// 
439 439
      ///\code
440 440
      ///double s=0;
441 441
      ///for(LpBase::Expr::CoeffIt i(e);i!=INVALID;++i)
442 442
      ///  s+= *i * primal(i);
443 443
      ///\endcode
444 444
      class CoeffIt {
445 445
      private:
446 446

	
447 447
        std::map<int, Value>::iterator _it, _end;
448 448

	
449 449
      public:
450 450

	
451 451
        /// Sets the iterator to the first term
452 452
        
453 453
        /// Sets the iterator to the first term of the expression.
454 454
        ///
455 455
        CoeffIt(Expr& e)
456 456
          : _it(e.comps.begin()), _end(e.comps.end()){}
457 457

	
458 458
        /// Convert the iterator to the column of the term
459 459
        operator Col() const {
460 460
          return colFromId(_it->first);
461 461
        }
462 462

	
463 463
        /// Returns the coefficient of the term
464 464
        Value& operator*() { return _it->second; }
465 465

	
466 466
        /// Returns the coefficient of the term
467 467
        const Value& operator*() const { return _it->second; }
468 468
        /// Next term
469 469
        
470 470
        /// Assign the iterator to the next term.
471 471
        ///
472 472
        CoeffIt& operator++() { ++_it; return *this; }
473 473

	
474 474
        /// Equality operator
475 475
        bool operator==(Invalid) const { return _it == _end; }
476 476
        /// Inequality operator
477 477
        bool operator!=(Invalid) const { return _it != _end; }
478 478
      };
479 479

	
480 480
      /// Const iterator over the expression
481 481
      
482 482
      ///The iterator iterates over the terms of the expression. 
483 483
      /// 
484 484
      ///\code
485 485
      ///double s=0;
486 486
      ///for(LpBase::Expr::ConstCoeffIt i(e);i!=INVALID;++i)
487 487
      ///  s+=*i * primal(i);
488 488
      ///\endcode
489 489
      class ConstCoeffIt {
490 490
      private:
491 491

	
492 492
        std::map<int, Value>::const_iterator _it, _end;
493 493

	
494 494
      public:
495 495

	
496 496
        /// Sets the iterator to the first term
497 497
        
498 498
        /// Sets the iterator to the first term of the expression.
499 499
        ///
500 500
        ConstCoeffIt(const Expr& e)
501 501
          : _it(e.comps.begin()), _end(e.comps.end()){}
502 502

	
503 503
        /// Convert the iterator to the column of the term
504 504
        operator Col() const {
505 505
          return colFromId(_it->first);
506 506
        }
507 507

	
508 508
        /// Returns the coefficient of the term
509 509
        const Value& operator*() const { return _it->second; }
510 510

	
511 511
        /// Next term
512 512
        
513 513
        /// Assign the iterator to the next term.
514 514
        ///
515 515
        ConstCoeffIt& operator++() { ++_it; return *this; }
516 516

	
517 517
        /// Equality operator
518 518
        bool operator==(Invalid) const { return _it == _end; }
519 519
        /// Inequality operator
520 520
        bool operator!=(Invalid) const { return _it != _end; }
521 521
      };
522 522

	
523 523
    };
524 524

	
525 525
    ///Linear constraint
526 526

	
527 527
    ///This data stucture represents a linear constraint in the LP.
528 528
    ///Basically it is a linear expression with a lower or an upper bound
529 529
    ///(or both). These parts of the constraint can be obtained by the member
530 530
    ///functions \ref expr(), \ref lowerBound() and \ref upperBound(),
531 531
    ///respectively.
532 532
    ///There are two ways to construct a constraint.
533 533
    ///- You can set the linear expression and the bounds directly
534 534
    ///  by the functions above.
535 535
    ///- The operators <tt>\<=</tt>, <tt>==</tt> and  <tt>\>=</tt>
536 536
    ///  are defined between expressions, or even between constraints whenever
537 537
    ///  it makes sense. Therefore if \c e and \c f are linear expressions and
538 538
    ///  \c s and \c t are numbers, then the followings are valid expressions
539 539
    ///  and thus they can be used directly e.g. in \ref addRow() whenever
540 540
    ///  it makes sense.
541 541
    ///\code
542 542
    ///  e<=s
543 543
    ///  e<=f
544 544
    ///  e==f
545 545
    ///  s<=e<=t
546 546
    ///  e>=t
547 547
    ///\endcode
548 548
    ///\warning The validity of a constraint is checked only at run
549 549
    ///time, so e.g. \ref addRow(<tt>x[1]\<=x[2]<=5</tt>) will
550 550
    ///compile, but will fail an assertion.
551 551
    class Constr
552 552
    {
553 553
    public:
554 554
      typedef LpBase::Expr Expr;
555 555
      typedef Expr::Key Key;
556 556
      typedef Expr::Value Value;
557 557

	
558 558
    protected:
559 559
      Expr _expr;
560 560
      Value _lb,_ub;
561 561
    public:
562 562
      ///\e
563 563
      Constr() : _expr(), _lb(NaN), _ub(NaN) {}
564 564
      ///\e
565 565
      Constr(Value lb, const Expr &e, Value ub) :
566 566
        _expr(e), _lb(lb), _ub(ub) {}
567 567
      Constr(const Expr &e) :
568 568
        _expr(e), _lb(NaN), _ub(NaN) {}
569 569
      ///\e
570 570
      void clear()
571 571
      {
572 572
        _expr.clear();
573 573
        _lb=_ub=NaN;
574 574
      }
575 575

	
576 576
      ///Reference to the linear expression
577 577
      Expr &expr() { return _expr; }
578 578
      ///Cont reference to the linear expression
579 579
      const Expr &expr() const { return _expr; }
580 580
      ///Reference to the lower bound.
581 581

	
582 582
      ///\return
583 583
      ///- \ref INF "INF": the constraint is lower unbounded.
584 584
      ///- \ref NaN "NaN": lower bound has not been set.
585 585
      ///- finite number: the lower bound
586 586
      Value &lowerBound() { return _lb; }
587 587
      ///The const version of \ref lowerBound()
588 588
      const Value &lowerBound() const { return _lb; }
589 589
      ///Reference to the upper bound.
590 590

	
591 591
      ///\return
592 592
      ///- \ref INF "INF": the constraint is upper unbounded.
593 593
      ///- \ref NaN "NaN": upper bound has not been set.
594 594
      ///- finite number: the upper bound
595 595
      Value &upperBound() { return _ub; }
596 596
      ///The const version of \ref upperBound()
597 597
      const Value &upperBound() const { return _ub; }
598 598
      ///Is the constraint lower bounded?
599 599
      bool lowerBounded() const {
600
        return _lb != -INF && !isnan(_lb);
600
        return _lb != -INF && !isNaN(_lb);
601 601
      }
602 602
      ///Is the constraint upper bounded?
603 603
      bool upperBounded() const {
604
        return _ub != INF && !isnan(_ub);
604
        return _ub != INF && !isNaN(_ub);
605 605
      }
606 606

	
607 607
    };
608 608

	
609 609
    ///Linear expression of rows
610 610

	
611 611
    ///This data structure represents a column of the matrix,
612 612
    ///thas is it strores a linear expression of the dual variables
613 613
    ///(\ref Row "Row"s).
614 614
    ///
615 615
    ///There are several ways to access and modify the contents of this
616 616
    ///container.
617 617
    ///\code
618 618
    ///e[v]=5;
619 619
    ///e[v]+=12;
620 620
    ///e.erase(v);
621 621
    ///\endcode
622 622
    ///or you can also iterate through its elements.
623 623
    ///\code
624 624
    ///double s=0;
625 625
    ///for(LpBase::DualExpr::ConstCoeffIt i(e);i!=INVALID;++i)
626 626
    ///  s+=*i;
627 627
    ///\endcode
628 628
    ///(This code computes the sum of all coefficients).
629 629
    ///- Numbers (<tt>double</tt>'s)
630 630
    ///and variables (\ref Row "Row"s) directly convert to an
631 631
    ///\ref DualExpr and the usual linear operations are defined, so
632 632
    ///\code
633 633
    ///v+w
634 634
    ///2*v-3.12*(v-w/2)
635 635
    ///v*2.1+(3*v+(v*12+w)*3)/2
636 636
    ///\endcode
637 637
    ///are valid \ref DualExpr dual expressions.
638 638
    ///The usual assignment operations are also defined.
639 639
    ///\code
640 640
    ///e=v+w;
641 641
    ///e+=2*v-3.12*(v-w/2);
642 642
    ///e*=3.4;
643 643
    ///e/=5;
644 644
    ///\endcode
645 645
    ///
646 646
    ///\sa Expr
647 647
    class DualExpr {
648 648
      friend class LpBase;
649 649
    public:
650 650
      /// The key type of the expression
651 651
      typedef LpBase::Row Key;
652 652
      /// The value type of the expression
653 653
      typedef LpBase::Value Value;
654 654

	
655 655
    protected:
656 656
      std::map<int, Value> comps;
657 657

	
658 658
    public:
659 659
      typedef True SolverExpr;
660 660
      /// Default constructor
661 661
      
662 662
      /// Construct an empty expression, the coefficients are
663 663
      /// initialized to zero.
664 664
      DualExpr() {}
665 665
      /// Construct an expression from a row
666 666

	
667 667
      /// Construct an expression, which has a term with \c r dual
668 668
      /// variable and 1.0 coefficient.
669 669
      DualExpr(const Row &r) {
670 670
        typedef std::map<int, Value>::value_type pair_type;
671 671
        comps.insert(pair_type(id(r), 1));
672 672
      }
673 673
      /// Returns the coefficient of the row
674 674
      Value operator[](const Row& r) const {
675 675
        std::map<int, Value>::const_iterator it = comps.find(id(r));
676 676
        if (it != comps.end()) {
677 677
          return it->second;
678 678
        } else {
679 679
          return 0;
680 680
        }
681 681
      }
682 682
      /// Returns the coefficient of the row
683 683
      Value& operator[](const Row& r) {
684 684
        return comps[id(r)];
685 685
      }
686 686
      /// Sets the coefficient of the row
687 687
      void set(const Row &r, const Value &v) {
688 688
        if (v != 0.0) {
689 689
          typedef std::map<int, Value>::value_type pair_type;
690 690
          comps.insert(pair_type(id(r), v));
691 691
        } else {
692 692
          comps.erase(id(r));
693 693
        }
694 694
      }
695 695
      /// \brief Removes the coefficients which's absolute value does
696 696
      /// not exceed \c epsilon. 
697 697
      void simplify(Value epsilon = 0.0) {
698 698
        std::map<int, Value>::iterator it=comps.begin();
699 699
        while (it != comps.end()) {
700 700
          std::map<int, Value>::iterator jt=it;
701 701
          ++jt;
702 702
          if (std::fabs((*it).second) <= epsilon) comps.erase(it);
703 703
          it=jt;
704 704
        }
705 705
      }
706 706

	
707 707
      void simplify(Value epsilon = 0.0) const {
708 708
        const_cast<DualExpr*>(this)->simplify(epsilon);
709 709
      }
710 710

	
711 711
      ///Sets all coefficients to 0.
712 712
      void clear() {
713 713
        comps.clear();
714 714
      }
715 715
      ///Compound assignment
716 716
      DualExpr &operator+=(const DualExpr &e) {
717 717
        for (std::map<int, Value>::const_iterator it=e.comps.begin();
718 718
             it!=e.comps.end(); ++it)
719 719
          comps[it->first]+=it->second;
720 720
        return *this;
721 721
      }
722 722
      ///Compound assignment
723 723
      DualExpr &operator-=(const DualExpr &e) {
724 724
        for (std::map<int, Value>::const_iterator it=e.comps.begin();
725 725
             it!=e.comps.end(); ++it)
726 726
          comps[it->first]-=it->second;
727 727
        return *this;
728 728
      }
729 729
      ///Multiply with a constant
730 730
      DualExpr &operator*=(const Value &v) {
731 731
        for (std::map<int, Value>::iterator it=comps.begin();
732 732
             it!=comps.end(); ++it)
733 733
          it->second*=v;
734 734
        return *this;
735 735
      }
736 736
      ///Division with a constant
737 737
      DualExpr &operator/=(const Value &v) {
738 738
        for (std::map<int, Value>::iterator it=comps.begin();
739 739
             it!=comps.end(); ++it)
740 740
          it->second/=v;
741 741
        return *this;
742 742
      }
743 743

	
744 744
      ///Iterator over the expression
745 745
      
746 746
      ///The iterator iterates over the terms of the expression. 
747 747
      /// 
748 748
      ///\code
749 749
      ///double s=0;
750 750
      ///for(LpBase::DualExpr::CoeffIt i(e);i!=INVALID;++i)
751 751
      ///  s+= *i * dual(i);
752 752
      ///\endcode
753 753
      class CoeffIt {
754 754
      private:
755 755

	
756 756
        std::map<int, Value>::iterator _it, _end;
757 757

	
758 758
      public:
759 759

	
760 760
        /// Sets the iterator to the first term
761 761
        
762 762
        /// Sets the iterator to the first term of the expression.
763 763
        ///
764 764
        CoeffIt(DualExpr& e)
765 765
          : _it(e.comps.begin()), _end(e.comps.end()){}
766 766

	
767 767
        /// Convert the iterator to the row of the term
768 768
        operator Row() const {
769 769
          return rowFromId(_it->first);
770 770
        }
771 771

	
772 772
        /// Returns the coefficient of the term
773 773
        Value& operator*() { return _it->second; }
774 774

	
775 775
        /// Returns the coefficient of the term
776 776
        const Value& operator*() const { return _it->second; }
777 777

	
778 778
        /// Next term
779 779
        
780 780
        /// Assign the iterator to the next term.
781 781
        ///
782 782
        CoeffIt& operator++() { ++_it; return *this; }
783 783

	
784 784
        /// Equality operator
785 785
        bool operator==(Invalid) const { return _it == _end; }
786 786
        /// Inequality operator
787 787
        bool operator!=(Invalid) const { return _it != _end; }
788 788
      };
789 789

	
790 790
      ///Iterator over the expression
791 791
      
792 792
      ///The iterator iterates over the terms of the expression. 
793 793
      /// 
794 794
      ///\code
795 795
      ///double s=0;
796 796
      ///for(LpBase::DualExpr::ConstCoeffIt i(e);i!=INVALID;++i)
... ...
@@ -1477,421 +1477,421 @@
1477 1477

	
1478 1478
    /// The upper bound of a constraint (row) has to be given by an
1479 1479
    /// extended number of type Value, i.e. a finite number of type
1480 1480
    /// Value or -\ref INF.
1481 1481
    void rowUpperBound(Row r, Value value) {
1482 1482
      _setRowUpperBound(rows(id(r)),value);
1483 1483
    }
1484 1484

	
1485 1485
    /// Get the upper bound of a row (i.e a constraint)
1486 1486

	
1487 1487
    /// This function returns the upper bound for row (constraint) \c c
1488 1488
    /// (this might be -\ref INF as well).
1489 1489
    ///\return The upper bound for row \c r
1490 1490
    Value rowUpperBound(Row r) const {
1491 1491
      return _getRowUpperBound(rows(id(r)));
1492 1492
    }
1493 1493

	
1494 1494
    ///Set an element of the objective function
1495 1495
    void objCoeff(Col c, Value v) {_setObjCoeff(cols(id(c)),v); };
1496 1496

	
1497 1497
    ///Get an element of the objective function
1498 1498
    Value objCoeff(Col c) const { return _getObjCoeff(cols(id(c))); };
1499 1499

	
1500 1500
    ///Set the objective function
1501 1501

	
1502 1502
    ///\param e is a linear expression of type \ref Expr.
1503 1503
    ///
1504 1504
    void obj(const Expr& e) {
1505 1505
      _setObjCoeffs(ExprIterator(e.comps.begin(), cols),
1506 1506
                    ExprIterator(e.comps.end(), cols));
1507 1507
      obj_const_comp = *e;
1508 1508
    }
1509 1509

	
1510 1510
    ///Get the objective function
1511 1511

	
1512 1512
    ///\return the objective function as a linear expression of type
1513 1513
    ///Expr.
1514 1514
    Expr obj() const {
1515 1515
      Expr e;
1516 1516
      _getObjCoeffs(InsertIterator(e.comps, cols));
1517 1517
      *e = obj_const_comp;
1518 1518
      return e;
1519 1519
    }
1520 1520

	
1521 1521

	
1522 1522
    ///Set the direction of optimization
1523 1523
    void sense(Sense sense) { _setSense(sense); }
1524 1524

	
1525 1525
    ///Query the direction of the optimization
1526 1526
    Sense sense() const {return _getSense(); }
1527 1527

	
1528 1528
    ///Set the sense to maximization
1529 1529
    void max() { _setSense(MAX); }
1530 1530

	
1531 1531
    ///Set the sense to maximization
1532 1532
    void min() { _setSense(MIN); }
1533 1533

	
1534 1534
    ///Clears the problem
1535 1535
    void clear() { _clear(); }
1536 1536

	
1537 1537
    ///@}
1538 1538

	
1539 1539
  };
1540 1540

	
1541 1541
  /// Addition
1542 1542

	
1543 1543
  ///\relates LpBase::Expr
1544 1544
  ///
1545 1545
  inline LpBase::Expr operator+(const LpBase::Expr &a, const LpBase::Expr &b) {
1546 1546
    LpBase::Expr tmp(a);
1547 1547
    tmp+=b;
1548 1548
    return tmp;
1549 1549
  }
1550 1550
  ///Substraction
1551 1551

	
1552 1552
  ///\relates LpBase::Expr
1553 1553
  ///
1554 1554
  inline LpBase::Expr operator-(const LpBase::Expr &a, const LpBase::Expr &b) {
1555 1555
    LpBase::Expr tmp(a);
1556 1556
    tmp-=b;
1557 1557
    return tmp;
1558 1558
  }
1559 1559
  ///Multiply with constant
1560 1560

	
1561 1561
  ///\relates LpBase::Expr
1562 1562
  ///
1563 1563
  inline LpBase::Expr operator*(const LpBase::Expr &a, const LpBase::Value &b) {
1564 1564
    LpBase::Expr tmp(a);
1565 1565
    tmp*=b;
1566 1566
    return tmp;
1567 1567
  }
1568 1568

	
1569 1569
  ///Multiply with constant
1570 1570

	
1571 1571
  ///\relates LpBase::Expr
1572 1572
  ///
1573 1573
  inline LpBase::Expr operator*(const LpBase::Value &a, const LpBase::Expr &b) {
1574 1574
    LpBase::Expr tmp(b);
1575 1575
    tmp*=a;
1576 1576
    return tmp;
1577 1577
  }
1578 1578
  ///Divide with constant
1579 1579

	
1580 1580
  ///\relates LpBase::Expr
1581 1581
  ///
1582 1582
  inline LpBase::Expr operator/(const LpBase::Expr &a, const LpBase::Value &b) {
1583 1583
    LpBase::Expr tmp(a);
1584 1584
    tmp/=b;
1585 1585
    return tmp;
1586 1586
  }
1587 1587

	
1588 1588
  ///Create constraint
1589 1589

	
1590 1590
  ///\relates LpBase::Constr
1591 1591
  ///
1592 1592
  inline LpBase::Constr operator<=(const LpBase::Expr &e,
1593 1593
                                   const LpBase::Expr &f) {
1594 1594
    return LpBase::Constr(0, f - e, LpBase::INF);
1595 1595
  }
1596 1596

	
1597 1597
  ///Create constraint
1598 1598

	
1599 1599
  ///\relates LpBase::Constr
1600 1600
  ///
1601 1601
  inline LpBase::Constr operator<=(const LpBase::Value &e,
1602 1602
                                   const LpBase::Expr &f) {
1603 1603
    return LpBase::Constr(e, f, LpBase::NaN);
1604 1604
  }
1605 1605

	
1606 1606
  ///Create constraint
1607 1607

	
1608 1608
  ///\relates LpBase::Constr
1609 1609
  ///
1610 1610
  inline LpBase::Constr operator<=(const LpBase::Expr &e,
1611 1611
                                   const LpBase::Value &f) {
1612 1612
    return LpBase::Constr(- LpBase::INF, e, f);
1613 1613
  }
1614 1614

	
1615 1615
  ///Create constraint
1616 1616

	
1617 1617
  ///\relates LpBase::Constr
1618 1618
  ///
1619 1619
  inline LpBase::Constr operator>=(const LpBase::Expr &e,
1620 1620
                                   const LpBase::Expr &f) {
1621 1621
    return LpBase::Constr(0, e - f, LpBase::INF);
1622 1622
  }
1623 1623

	
1624 1624

	
1625 1625
  ///Create constraint
1626 1626

	
1627 1627
  ///\relates LpBase::Constr
1628 1628
  ///
1629 1629
  inline LpBase::Constr operator>=(const LpBase::Value &e,
1630 1630
                                   const LpBase::Expr &f) {
1631 1631
    return LpBase::Constr(LpBase::NaN, f, e);
1632 1632
  }
1633 1633

	
1634 1634

	
1635 1635
  ///Create constraint
1636 1636

	
1637 1637
  ///\relates LpBase::Constr
1638 1638
  ///
1639 1639
  inline LpBase::Constr operator>=(const LpBase::Expr &e,
1640 1640
                                   const LpBase::Value &f) {
1641 1641
    return LpBase::Constr(f, e, LpBase::INF);
1642 1642
  }
1643 1643

	
1644 1644
  ///Create constraint
1645 1645

	
1646 1646
  ///\relates LpBase::Constr
1647 1647
  ///
1648 1648
  inline LpBase::Constr operator==(const LpBase::Expr &e,
1649 1649
                                   const LpBase::Value &f) {
1650 1650
    return LpBase::Constr(f, e, f);
1651 1651
  }
1652 1652

	
1653 1653
  ///Create constraint
1654 1654

	
1655 1655
  ///\relates LpBase::Constr
1656 1656
  ///
1657 1657
  inline LpBase::Constr operator==(const LpBase::Expr &e,
1658 1658
                                   const LpBase::Expr &f) {
1659 1659
    return LpBase::Constr(0, f - e, 0);
1660 1660
  }
1661 1661

	
1662 1662
  ///Create constraint
1663 1663

	
1664 1664
  ///\relates LpBase::Constr
1665 1665
  ///
1666 1666
  inline LpBase::Constr operator<=(const LpBase::Value &n,
1667 1667
                                   const LpBase::Constr &c) {
1668 1668
    LpBase::Constr tmp(c);
1669
    LEMON_ASSERT(isnan(tmp.lowerBound()), "Wrong LP constraint");
1669
    LEMON_ASSERT(isNaN(tmp.lowerBound()), "Wrong LP constraint");
1670 1670
    tmp.lowerBound()=n;
1671 1671
    return tmp;
1672 1672
  }
1673 1673
  ///Create constraint
1674 1674

	
1675 1675
  ///\relates LpBase::Constr
1676 1676
  ///
1677 1677
  inline LpBase::Constr operator<=(const LpBase::Constr &c,
1678 1678
                                   const LpBase::Value &n)
1679 1679
  {
1680 1680
    LpBase::Constr tmp(c);
1681
    LEMON_ASSERT(isnan(tmp.upperBound()), "Wrong LP constraint");
1681
    LEMON_ASSERT(isNaN(tmp.upperBound()), "Wrong LP constraint");
1682 1682
    tmp.upperBound()=n;
1683 1683
    return tmp;
1684 1684
  }
1685 1685

	
1686 1686
  ///Create constraint
1687 1687

	
1688 1688
  ///\relates LpBase::Constr
1689 1689
  ///
1690 1690
  inline LpBase::Constr operator>=(const LpBase::Value &n,
1691 1691
                                   const LpBase::Constr &c) {
1692 1692
    LpBase::Constr tmp(c);
1693
    LEMON_ASSERT(isnan(tmp.upperBound()), "Wrong LP constraint");
1693
    LEMON_ASSERT(isNaN(tmp.upperBound()), "Wrong LP constraint");
1694 1694
    tmp.upperBound()=n;
1695 1695
    return tmp;
1696 1696
  }
1697 1697
  ///Create constraint
1698 1698

	
1699 1699
  ///\relates LpBase::Constr
1700 1700
  ///
1701 1701
  inline LpBase::Constr operator>=(const LpBase::Constr &c,
1702 1702
                                   const LpBase::Value &n)
1703 1703
  {
1704 1704
    LpBase::Constr tmp(c);
1705
    LEMON_ASSERT(isnan(tmp.lowerBound()), "Wrong LP constraint");
1705
    LEMON_ASSERT(isNaN(tmp.lowerBound()), "Wrong LP constraint");
1706 1706
    tmp.lowerBound()=n;
1707 1707
    return tmp;
1708 1708
  }
1709 1709

	
1710 1710
  ///Addition
1711 1711

	
1712 1712
  ///\relates LpBase::DualExpr
1713 1713
  ///
1714 1714
  inline LpBase::DualExpr operator+(const LpBase::DualExpr &a,
1715 1715
                                    const LpBase::DualExpr &b) {
1716 1716
    LpBase::DualExpr tmp(a);
1717 1717
    tmp+=b;
1718 1718
    return tmp;
1719 1719
  }
1720 1720
  ///Substraction
1721 1721

	
1722 1722
  ///\relates LpBase::DualExpr
1723 1723
  ///
1724 1724
  inline LpBase::DualExpr operator-(const LpBase::DualExpr &a,
1725 1725
                                    const LpBase::DualExpr &b) {
1726 1726
    LpBase::DualExpr tmp(a);
1727 1727
    tmp-=b;
1728 1728
    return tmp;
1729 1729
  }
1730 1730
  ///Multiply with constant
1731 1731

	
1732 1732
  ///\relates LpBase::DualExpr
1733 1733
  ///
1734 1734
  inline LpBase::DualExpr operator*(const LpBase::DualExpr &a,
1735 1735
                                    const LpBase::Value &b) {
1736 1736
    LpBase::DualExpr tmp(a);
1737 1737
    tmp*=b;
1738 1738
    return tmp;
1739 1739
  }
1740 1740

	
1741 1741
  ///Multiply with constant
1742 1742

	
1743 1743
  ///\relates LpBase::DualExpr
1744 1744
  ///
1745 1745
  inline LpBase::DualExpr operator*(const LpBase::Value &a,
1746 1746
                                    const LpBase::DualExpr &b) {
1747 1747
    LpBase::DualExpr tmp(b);
1748 1748
    tmp*=a;
1749 1749
    return tmp;
1750 1750
  }
1751 1751
  ///Divide with constant
1752 1752

	
1753 1753
  ///\relates LpBase::DualExpr
1754 1754
  ///
1755 1755
  inline LpBase::DualExpr operator/(const LpBase::DualExpr &a,
1756 1756
                                    const LpBase::Value &b) {
1757 1757
    LpBase::DualExpr tmp(a);
1758 1758
    tmp/=b;
1759 1759
    return tmp;
1760 1760
  }
1761 1761

	
1762 1762
  /// \ingroup lp_group
1763 1763
  ///
1764 1764
  /// \brief Common base class for LP solvers
1765 1765
  ///
1766 1766
  /// This class is an abstract base class for LP solvers. This class
1767 1767
  /// provides a full interface for set and modify an LP problem,
1768 1768
  /// solve it and retrieve the solution. You can use one of the
1769 1769
  /// descendants as a concrete implementation, or the \c Lp
1770 1770
  /// default LP solver. However, if you would like to handle LP
1771 1771
  /// solvers as reference or pointer in a generic way, you can use
1772 1772
  /// this class directly.
1773 1773
  class LpSolver : virtual public LpBase {
1774 1774
  public:
1775 1775

	
1776 1776
    /// The problem types for primal and dual problems
1777 1777
    enum ProblemType {
1778 1778
      ///Feasible solution hasn't been found (but may exist).
1779 1779
      UNDEFINED = 0,
1780 1780
      ///The problem has no feasible solution
1781 1781
      INFEASIBLE = 1,
1782 1782
      ///Feasible solution found
1783 1783
      FEASIBLE = 2,
1784 1784
      ///Optimal solution exists and found
1785 1785
      OPTIMAL = 3,
1786 1786
      ///The cost function is unbounded
1787 1787
      UNBOUNDED = 4
1788 1788
    };
1789 1789

	
1790 1790
    ///The basis status of variables
1791 1791
    enum VarStatus {
1792 1792
      /// The variable is in the basis
1793 1793
      BASIC, 
1794 1794
      /// The variable is free, but not basic
1795 1795
      FREE,
1796 1796
      /// The variable has active lower bound 
1797 1797
      LOWER,
1798 1798
      /// The variable has active upper bound
1799 1799
      UPPER,
1800 1800
      /// The variable is non-basic and fixed
1801 1801
      FIXED
1802 1802
    };
1803 1803

	
1804 1804
  protected:
1805 1805

	
1806 1806
    virtual SolveExitStatus _solve() = 0;
1807 1807

	
1808 1808
    virtual Value _getPrimal(int i) const = 0;
1809 1809
    virtual Value _getDual(int i) const = 0;
1810 1810

	
1811 1811
    virtual Value _getPrimalRay(int i) const = 0;
1812 1812
    virtual Value _getDualRay(int i) const = 0;
1813 1813

	
1814 1814
    virtual Value _getPrimalValue() const = 0;
1815 1815

	
1816 1816
    virtual VarStatus _getColStatus(int i) const = 0;
1817 1817
    virtual VarStatus _getRowStatus(int i) const = 0;
1818 1818

	
1819 1819
    virtual ProblemType _getPrimalType() const = 0;
1820 1820
    virtual ProblemType _getDualType() const = 0;
1821 1821

	
1822 1822
  public:
1823 1823

	
1824 1824
    ///\name Solve the LP
1825 1825

	
1826 1826
    ///@{
1827 1827

	
1828 1828
    ///\e Solve the LP problem at hand
1829 1829
    ///
1830 1830
    ///\return The result of the optimization procedure. Possible
1831 1831
    ///values and their meanings can be found in the documentation of
1832 1832
    ///\ref SolveExitStatus.
1833 1833
    SolveExitStatus solve() { return _solve(); }
1834 1834

	
1835 1835
    ///@}
1836 1836

	
1837 1837
    ///\name Obtain the solution
1838 1838

	
1839 1839
    ///@{
1840 1840

	
1841 1841
    /// The type of the primal problem
1842 1842
    ProblemType primalType() const {
1843 1843
      return _getPrimalType();
1844 1844
    }
1845 1845

	
1846 1846
    /// The type of the dual problem
1847 1847
    ProblemType dualType() const {
1848 1848
      return _getDualType();
1849 1849
    }
1850 1850

	
1851 1851
    /// Return the primal value of the column
1852 1852

	
1853 1853
    /// Return the primal value of the column.
1854 1854
    /// \pre The problem is solved.
1855 1855
    Value primal(Col c) const { return _getPrimal(cols(id(c))); }
1856 1856

	
1857 1857
    /// Return the primal value of the expression
1858 1858

	
1859 1859
    /// Return the primal value of the expression, i.e. the dot
1860 1860
    /// product of the primal solution and the expression.
1861 1861
    /// \pre The problem is solved.
1862 1862
    Value primal(const Expr& e) const {
1863 1863
      double res = *e;
1864 1864
      for (Expr::ConstCoeffIt c(e); c != INVALID; ++c) {
1865 1865
        res += *c * primal(c);
1866 1866
      }
1867 1867
      return res;
1868 1868
    }
1869 1869
    /// Returns a component of the primal ray
1870 1870
    
1871 1871
    /// The primal ray is solution of the modified primal problem,
1872 1872
    /// where we change each finite bound to 0, and we looking for a
1873 1873
    /// negative objective value in case of minimization, and positive
1874 1874
    /// objective value for maximization. If there is such solution,
1875 1875
    /// that proofs the unsolvability of the dual problem, and if a
1876 1876
    /// feasible primal solution exists, then the unboundness of
1877 1877
    /// primal problem.
1878 1878
    ///
1879 1879
    /// \pre The problem is solved and the dual problem is infeasible.
1880 1880
    /// \note Some solvers does not provide primal ray calculation
1881 1881
    /// functions.
1882 1882
    Value primalRay(Col c) const { return _getPrimalRay(cols(id(c))); }
1883 1883

	
1884 1884
    /// Return the dual value of the row
1885 1885

	
1886 1886
    /// Return the dual value of the row.
1887 1887
    /// \pre The problem is solved.
1888 1888
    Value dual(Row r) const { return _getDual(rows(id(r))); }
1889 1889

	
1890 1890
    /// Return the dual value of the dual expression
1891 1891

	
1892 1892
    /// Return the dual value of the dual expression, i.e. the dot
1893 1893
    /// product of the dual solution and the dual expression.
1894 1894
    /// \pre The problem is solved.
1895 1895
    Value dual(const DualExpr& e) const {
1896 1896
      double res = 0.0;
1897 1897
      for (DualExpr::ConstCoeffIt r(e); r != INVALID; ++r) {
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_MATH_H
20 20
#define LEMON_MATH_H
21 21

	
22 22
///\ingroup misc
23 23
///\file
24 24
///\brief Some extensions to the standard \c cmath library.
25 25
///
26 26
///Some extensions to the standard \c cmath library.
27 27
///
28 28
///This file includes the standard math library (cmath).
29 29

	
30 30
#include<cmath>
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  /// \addtogroup misc
35 35
  /// @{
36 36

	
37 37
  /// The Euler constant
38 38
  const long double E       = 2.7182818284590452353602874713526625L;
39 39
  /// log_2(e)
40 40
  const long double LOG2E   = 1.4426950408889634073599246810018921L;
41 41
  /// log_10(e)
42 42
  const long double LOG10E  = 0.4342944819032518276511289189166051L;
43 43
  /// ln(2)
44 44
  const long double LN2     = 0.6931471805599453094172321214581766L;
45 45
  /// ln(10)
46 46
  const long double LN10    = 2.3025850929940456840179914546843642L;
47 47
  /// pi
48 48
  const long double PI      = 3.1415926535897932384626433832795029L;
49 49
  /// pi/2
50 50
  const long double PI_2    = 1.5707963267948966192313216916397514L;
51 51
  /// pi/4
52 52
  const long double PI_4    = 0.7853981633974483096156608458198757L;
53 53
  /// sqrt(2)
54 54
  const long double SQRT2   = 1.4142135623730950488016887242096981L;
55 55
  /// 1/sqrt(2)
56 56
  const long double SQRT1_2 = 0.7071067811865475244008443621048490L;
57 57

	
58 58
  ///Check whether the parameter is NaN or not
59 59
  
60 60
  ///This function checks whether the parameter is NaN or not.
61 61
  ///Is should be equivalent with std::isnan(), but it is not
62 62
  ///provided by all compilers.
63
  inline bool isnan(double v)
63
  inline bool isNaN(double v)
64 64
    {
65 65
      return v!=v;
66 66
    }
67 67

	
68 68
  /// @}
69 69

	
70 70
} //namespace lemon
71 71

	
72 72
#endif //LEMON_TOLERANCE_H
0 comments (0 inline)