gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge
0 5 0
merge default
0 files changed with 37 insertions and 14 deletions:
↑ Collapse diff ↑
Ignore white space 128 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_GRAPH_TO_EPS_H
20 20
#define LEMON_GRAPH_TO_EPS_H
21 21

	
22 22
#include<iostream>
23 23
#include<fstream>
24 24
#include<sstream>
25 25
#include<algorithm>
26 26
#include<vector>
27 27

	
28 28
#ifndef WIN32
29 29
#include<sys/time.h>
30 30
#include<ctime>
31 31
#else
32
#ifndef WIN32_LEAN_AND_MEAN
32 33
#define WIN32_LEAN_AND_MEAN
34
#endif
35
#ifndef NOMINMAX
33 36
#define NOMINMAX
37
#endif
34 38
#include<windows.h>
35 39
#endif
36 40

	
37 41
#include<lemon/math.h>
38 42
#include<lemon/core.h>
39 43
#include<lemon/dim2.h>
40 44
#include<lemon/maps.h>
41 45
#include<lemon/color.h>
42 46
#include<lemon/bits/bezier.h>
43 47
#include<lemon/error.h>
44 48

	
45 49

	
46 50
///\ingroup eps_io
47 51
///\file
48 52
///\brief A well configurable tool for visualizing graphs
49 53

	
50 54
namespace lemon {
51 55

	
52 56
  namespace _graph_to_eps_bits {
53 57
    template<class MT>
54 58
    class _NegY {
55 59
    public:
56 60
      typedef typename MT::Key Key;
57 61
      typedef typename MT::Value Value;
58 62
      const MT &map;
59 63
      int yscale;
60 64
      _NegY(const MT &m,bool b) : map(m), yscale(1-b*2) {}
61 65
      Value operator[](Key n) { return Value(map[n].x,map[n].y*yscale);}
62 66
    };
63 67
  }
64 68

	
65 69
///Default traits class of GraphToEps
66 70

	
67 71
///Default traits class of \ref GraphToEps.
68 72
///
69 73
///\c G is the type of the underlying graph.
70 74
template<class G>
71 75
struct DefaultGraphToEpsTraits
72 76
{
73 77
  typedef G Graph;
74 78
  typedef typename Graph::Node Node;
75 79
  typedef typename Graph::NodeIt NodeIt;
76 80
  typedef typename Graph::Arc Arc;
77 81
  typedef typename Graph::ArcIt ArcIt;
78 82
  typedef typename Graph::InArcIt InArcIt;
79 83
  typedef typename Graph::OutArcIt OutArcIt;
80 84

	
81 85

	
82 86
  const Graph &g;
83 87

	
84 88
  std::ostream& os;
85 89

	
86 90
  typedef ConstMap<typename Graph::Node,dim2::Point<double> > CoordsMapType;
87 91
  CoordsMapType _coords;
88 92
  ConstMap<typename Graph::Node,double > _nodeSizes;
89 93
  ConstMap<typename Graph::Node,int > _nodeShapes;
90 94

	
91 95
  ConstMap<typename Graph::Node,Color > _nodeColors;
92 96
  ConstMap<typename Graph::Arc,Color > _arcColors;
93 97

	
94 98
  ConstMap<typename Graph::Arc,double > _arcWidths;
95 99

	
96 100
  double _arcWidthScale;
97 101

	
... ...
@@ -627,140 +631,152 @@
627 631
  ///
628 632
  ///\sa undirected()
629 633
  GraphToEps<T> &directed(bool b=true) {_undirected=!b;return *this;}
630 634

	
631 635
  ///Sets the title.
632 636

	
633 637
  ///Sets the title of the generated image,
634 638
  ///namely it inserts a <tt>%%Title:</tt> DSC field to the header of
635 639
  ///the EPS file.
636 640
  GraphToEps<T> &title(const std::string &t) {_title=t;return *this;}
637 641
  ///Sets the copyright statement.
638 642

	
639 643
  ///Sets the copyright statement of the generated image,
640 644
  ///namely it inserts a <tt>%%Copyright:</tt> DSC field to the header of
641 645
  ///the EPS file.
642 646
  GraphToEps<T> &copyright(const std::string &t) {_copyright=t;return *this;}
643 647

	
644 648
protected:
645 649
  bool isInsideNode(dim2::Point<double> p, double r,int t)
646 650
  {
647 651
    switch(t) {
648 652
    case CIRCLE:
649 653
    case MALE:
650 654
    case FEMALE:
651 655
      return p.normSquare()<=r*r;
652 656
    case SQUARE:
653 657
      return p.x<=r&&p.x>=-r&&p.y<=r&&p.y>=-r;
654 658
    case DIAMOND:
655 659
      return p.x+p.y<=r && p.x-p.y<=r && -p.x+p.y<=r && -p.x-p.y<=r;
656 660
    }
657 661
    return false;
658 662
  }
659 663

	
660 664
public:
661 665
  ~GraphToEps() { }
662 666

	
663 667
  ///Draws the graph.
664 668

	
665 669
  ///Like other functions using
666 670
  ///\ref named-templ-func-param "named template parameters",
667 671
  ///this function calls the algorithm itself, i.e. in this case
668 672
  ///it draws the graph.
669 673
  void run() {
670 674
    const double EPSILON=1e-9;
671 675
    if(dontPrint) return;
672 676

	
673 677
    _graph_to_eps_bits::_NegY<typename T::CoordsMapType>
674 678
      mycoords(_coords,_negY);
675 679

	
676 680
    os << "%!PS-Adobe-2.0 EPSF-2.0\n";
677 681
    if(_title.size()>0) os << "%%Title: " << _title << '\n';
678 682
     if(_copyright.size()>0) os << "%%Copyright: " << _copyright << '\n';
679 683
    os << "%%Creator: LEMON, graphToEps()\n";
680 684

	
681 685
    {
682 686
#ifndef WIN32
683 687
      timeval tv;
684 688
      gettimeofday(&tv, 0);
685 689

	
686 690
      char cbuf[26];
687 691
      ctime_r(&tv.tv_sec,cbuf);
688 692
      os << "%%CreationDate: " << cbuf;
689 693
#else
690 694
      SYSTEMTIME time;
691
      char buf1[11], buf2[9], buf3[5];
692

	
693 695
      GetSystemTime(&time);
696
#if defined(_MSC_VER) && (_MSC_VER < 1500)
697
      LPWSTR buf1, buf2, buf3;
694 698
      if (GetDateFormat(LOCALE_USER_DEFAULT, 0, &time,
695
                        "ddd MMM dd", buf1, 11) &&
699
                        L"ddd MMM dd", buf1, 11) &&
696 700
          GetTimeFormat(LOCALE_USER_DEFAULT, 0, &time,
697
                        "HH':'mm':'ss", buf2, 9) &&
701
                        L"HH':'mm':'ss", buf2, 9) &&
698 702
          GetDateFormat(LOCALE_USER_DEFAULT, 0, &time,
699
                                "yyyy", buf3, 5)) {
703
                        L"yyyy", buf3, 5)) {
700 704
        os << "%%CreationDate: " << buf1 << ' '
701 705
           << buf2 << ' ' << buf3 << std::endl;
702 706
      }
707
#else
708
        char buf1[11], buf2[9], buf3[5];
709
        if (GetDateFormat(LOCALE_USER_DEFAULT, 0, &time,
710
                          "ddd MMM dd", buf1, 11) &&
711
            GetTimeFormat(LOCALE_USER_DEFAULT, 0, &time,
712
                          "HH':'mm':'ss", buf2, 9) &&
713
            GetDateFormat(LOCALE_USER_DEFAULT, 0, &time,
714
                          "yyyy", buf3, 5)) {
715
          os << "%%CreationDate: " << buf1 << ' '
716
             << buf2 << ' ' << buf3 << std::endl;
717
        }
718
#endif
703 719
#endif
704 720
    }
705 721

	
706 722
    if (_autoArcWidthScale) {
707 723
      double max_w=0;
708 724
      for(ArcIt e(g);e!=INVALID;++e)
709 725
        max_w=std::max(double(_arcWidths[e]),max_w);
710 726
      if(max_w>EPSILON) {
711 727
        _arcWidthScale/=max_w;
712 728
      }
713 729
    }
714 730

	
715 731
    if (_autoNodeScale) {
716 732
      double max_s=0;
717 733
      for(NodeIt n(g);n!=INVALID;++n)
718 734
        max_s=std::max(double(_nodeSizes[n]),max_s);
719 735
      if(max_s>EPSILON) {
720 736
        _nodeScale/=max_s;
721 737
      }
722 738
    }
723 739

	
724 740
    double diag_len = 1;
725 741
    if(!(_absoluteNodeSizes&&_absoluteArcWidths)) {
726 742
      dim2::Box<double> bb;
727 743
      for(NodeIt n(g);n!=INVALID;++n) bb.add(mycoords[n]);
728 744
      if (bb.empty()) {
729 745
        bb = dim2::Box<double>(dim2::Point<double>(0,0));
730 746
      }
731 747
      diag_len = std::sqrt((bb.bottomLeft()-bb.topRight()).normSquare());
732 748
      if(diag_len<EPSILON) diag_len = 1;
733 749
      if(!_absoluteNodeSizes) _nodeScale*=diag_len;
734 750
      if(!_absoluteArcWidths) _arcWidthScale*=diag_len;
735 751
    }
736 752

	
737 753
    dim2::Box<double> bb;
738 754
    for(NodeIt n(g);n!=INVALID;++n) {
739 755
      double ns=_nodeSizes[n]*_nodeScale;
740 756
      dim2::Point<double> p(ns,ns);
741 757
      switch(_nodeShapes[n]) {
742 758
      case CIRCLE:
743 759
      case SQUARE:
744 760
      case DIAMOND:
745 761
        bb.add(p+mycoords[n]);
746 762
        bb.add(-p+mycoords[n]);
747 763
        break;
748 764
      case MALE:
749 765
        bb.add(-p+mycoords[n]);
750 766
        bb.add(dim2::Point<double>(1.5*ns,1.5*std::sqrt(3.0)*ns)+mycoords[n]);
751 767
        break;
752 768
      case FEMALE:
753 769
        bb.add(p+mycoords[n]);
754 770
        bb.add(dim2::Point<double>(-ns,-3.01*ns)+mycoords[n]);
755 771
        break;
756 772
      }
757 773
    }
758 774
    if (bb.empty()) {
759 775
      bb = dim2::Box<double>(dim2::Point<double>(0,0));
760 776
    }
761 777

	
762 778
    if(_scaleToA4)
763 779
      os <<"%%BoundingBox: 0 0 596 842\n%%DocumentPaperSizes: a4\n";
764 780
    else {
765 781
      if(_preScale) {
766 782
        //Rescale so that BoundingBox won't be neither to big nor too small.
Ignore white space 128 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-2008
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
///\file
20 20
///\brief The implementation of the LP solver interface.
21 21

	
22 22
#include <lemon/lp_base.h>
23 23
namespace lemon {
24 24

	
25
  const LpBase::Value LpBase::INF = std::numeric_limits<Value>::infinity();
26
  const LpBase::Value LpBase::NaN = std::numeric_limits<Value>::quiet_NaN();
25
  const LpBase::Value LpBase::INF =
26
    std::numeric_limits<LpBase::Value>::infinity();
27
  const LpBase::Value LpBase::NaN =
28
    std::numeric_limits<LpBase::Value>::quiet_NaN();
27 29

	
28 30
} //namespace lemon
Ignore white space 128 line context
... ...
@@ -536,133 +536,133 @@
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.
... ...
@@ -1605,165 +1605,165 @@
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
Ignore white space 128 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
Ignore white space 128 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_TIME_MEASURE_H
20 20
#define LEMON_TIME_MEASURE_H
21 21

	
22 22
///\ingroup timecount
23 23
///\file
24 24
///\brief Tools for measuring cpu usage
25 25

	
26 26
#ifdef WIN32
27
#ifndef WIN32_LEAN_AND_MEAN
27 28
#define WIN32_LEAN_AND_MEAN
29
#endif
30
#ifndef NOMINMAX
28 31
#define NOMINMAX
32
#endif
29 33
#include <windows.h>
30 34
#include <cmath>
31 35
#else
36
#include <unistd.h>
32 37
#include <sys/times.h>
33 38
#include <sys/time.h>
34 39
#endif
35 40

	
36 41
#include <string>
37 42
#include <fstream>
38 43
#include <iostream>
39 44

	
40 45
namespace lemon {
41 46

	
42 47
  /// \addtogroup timecount
43 48
  /// @{
44 49

	
45 50
  /// A class to store (cpu)time instances.
46 51

	
47 52
  /// This class stores five time values.
48 53
  /// - a real time
49 54
  /// - a user cpu time
50 55
  /// - a system cpu time
51 56
  /// - a user cpu time of children
52 57
  /// - a system cpu time of children
53 58
  ///
54 59
  /// TimeStamp's can be added to or substracted from each other and
55 60
  /// they can be pushed to a stream.
56 61
  ///
57 62
  /// In most cases, perhaps the \ref Timer or the \ref TimeReport
58 63
  /// class is what you want to use instead.
59 64

	
60 65
  class TimeStamp
61 66
  {
62 67
    double utime;
63 68
    double stime;
64 69
    double cutime;
65 70
    double cstime;
66 71
    double rtime;
67 72

	
68 73
    void _reset() {
69 74
      utime = stime = cutime = cstime = rtime = 0;
70 75
    }
71 76

	
72 77
  public:
73 78

	
74 79
    ///Read the current time values of the process
75 80
    void stamp()
76 81
    {
77 82
#ifndef WIN32
78 83
      timeval tv;
79 84
      gettimeofday(&tv, 0);
80 85
      rtime=tv.tv_sec+double(tv.tv_usec)/1e6;
81 86

	
82 87
      tms ts;
83 88
      double tck=sysconf(_SC_CLK_TCK);
84 89
      times(&ts);
85 90
      utime=ts.tms_utime/tck;
86 91
      stime=ts.tms_stime/tck;
87 92
      cutime=ts.tms_cutime/tck;
88 93
      cstime=ts.tms_cstime/tck;
89 94
#else
90 95
      static const double ch = 4294967296.0e-7;
91 96
      static const double cl = 1.0e-7;
92 97

	
93 98
      FILETIME system;
94 99
      GetSystemTimeAsFileTime(&system);
95 100
      rtime = ch * system.dwHighDateTime + cl * system.dwLowDateTime;
0 comments (0 inline)