↑ Collapse diff ↑
Ignore white space 6 line context
1
project (LEMON)
2
enable_testing ()
3
add_subdirectory (lemon)
4
add_subdirectory (demo)
5
add_subdirectory (test)
Ignore white space 6 line context
1
include_directories (${LEMON_SOURCE_DIR})
2

	
3
link_directories (${LEMON_BINARY_DIR}/lemon)
4

	
5
set (DEMOS
6
  arg_parser_demo
7
  graph_to_eps_demo
8
  lgf_demo)
9

	
10
foreach (DEMO_NAME ${DEMOS})
11
  add_executable (${DEMO_NAME} ${DEMO_NAME}.cc)
12
  target_link_libraries (${DEMO_NAME} lemon)
13
  endforeach (DEMO_NAME)
Ignore white space 6 line context
1
include_directories (${LEMON_SOURCE_DIR})
2
add_library (lemon arg_parser.cc base.cc color.cc random.cc)
Ignore white space 6 line context
1
include_directories (${LEMON_SOURCE_DIR})
2

	
3
link_directories (${LEMON_BINARY_DIR}/lemon)
4

	
5
set (TESTS
6
  bfs_test
7
  counter_test
8
  dfs_test
9
  digraph_test
10
  dim_test
11
  error_test
12
  graph_test
13
  kruskal_test
14
  maps_test
15
  random_test
16
  path_test
17
  time_measure_test
18
  unionfind_test)
19

	
20
foreach (TEST_NAME ${TESTS})
21
  add_executable (${TEST_NAME} ${TEST_NAME}.cc)
22
  target_link_libraries (${TEST_NAME} lemon)
23
  add_test(${TEST_NAME} ${TEST_NAME})
24
endforeach (TEST_NAME)
Ignore white space 6 line context
1 1
syntax: glob
2 2
*.obj
3 3
*.orig
4 4
*.rej
5 5
*~
6 6
*.o
7 7
*.log
8 8
*.lo
9 9
*.tar.*
10 10
Makefile.in
11 11
aclocal.m4
12 12
config.h.in
13 13
configure
14 14
Makefile
15 15
config.h
16 16
config.log
17 17
config.status
18 18
libtool
19 19
stamp-h1
20 20
lemon/lemon.pc
21 21
lemon/libemon.la
22 22
lemon/stamp-h2
23 23
doc/Doxyfile
24 24
.dirstamp
25 25
.libs/*
26 26
.deps/*
27 27
demo/*.eps
28 28

	
29 29
syntax: regexp
30 30
(.*/)?\#[^/]*\#$
31 31
^doc/html/.*
32 32
^autom4te.cache/.*
33 33
^build-aux/.*
34 34
^objs.*/.*
35 35
^test/[a-z_]*$
36 36
^demo/.*_demo$
37
^build/.*
38
CMakeFiles
39
DartTestfile.txt
40
cmake_install.cmake
41
CMakeCache.txt
Ignore white space 6 line context
1 1
/* -*- C++ -*-
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
///\ingroup demos
20 20
///\file
21 21
///\brief Demonstrating graph input and output
22 22
///
23 23
/// This simple demo program gives an example of how to read and write
24 24
/// a graph and additional maps (on the nodes or the edges) from/to a
25 25
/// stream. 
26 26
///
27 27
/// \include reader_writer_demo.cc
28 28

	
29 29
#include <iostream>
30 30
#include <lemon/smart_graph.h>
31 31
#include <lemon/lgf_reader.h>
32 32
#include <lemon/lgf_writer.h>
33 33
#include <lemon/random.h>
34 34

	
35 35

	
36 36
using namespace lemon;
37 37

	
38 38
int main(int argc, const char *argv[]) {
39 39
  const int n = argc > 1 ? std::atoi(argv[1]) : 20;
40
  const int e = argc > 2 ? std::atoi(argv[2]) : static_cast<int>(n * log(n));
40
  const int e = argc > 2 ? std::atoi(argv[2]) : static_cast<int>(n * std::log(double(n)));
41 41
  const int m = argc > 3 ? std::atoi(argv[3]) : 100;
42 42

	
43 43
  SmartDigraph digraph;
44 44

	
45 45
  std::stringstream ss;
46 46

	
47 47
  try {
48 48

	
49 49
    typedef SmartDigraph Digraph;
50 50
    typedef Digraph::Node Node;
51 51
    typedef Digraph::Arc Arc;
52 52
    typedef Digraph::ArcIt ArcIt;
53 53

	
54 54
    typedef Digraph::NodeMap<int> PotentialMap;
55 55
    typedef Digraph::ArcMap<int> CapacityMap;
56 56
    typedef Digraph::ArcMap<std::string> NameMap;
57 57

	
58 58
    Digraph digraph;
59 59
    PotentialMap potential(digraph);
60 60
    CapacityMap capacity(digraph);
61 61
    NameMap name(digraph);
62 62

	
63 63
    std::vector<Node> nodes;
64 64
    for (int i = 0; i < n; ++i) {
65 65
      Node node = digraph.addNode();
66 66
      potential[node] = rnd[m];
67 67
      nodes.push_back(node);
68 68
    }
69 69

	
70 70
    std::vector<Arc> arcs;
71 71
    for (int i = 0; i < e; ++i) {
72 72
      int s = rnd[n];
73 73
      int t = rnd[n];
74 74
      int c = rnd[m];
75 75
      Arc arc = digraph.addArc(nodes[s], nodes[t]);
76 76
      capacity[arc] = c;
77 77
      std::ostringstream os;
78 78
      os << "arc \t" << i << std::endl;
79 79
      name[arc] = os.str();
80 80
      arcs.push_back(arc);
81 81
    }
82 82

	
83 83

	
84 84
    DigraphWriter<Digraph>(ss, digraph).
85 85
      nodeMap("potential", potential).
86 86
      arcMap("capacity", capacity).
87 87
      arcMap("name", name).
88 88
      node("source", nodes[0]).
89 89
      node("target", nodes[1]).
90 90
      arc("bottleneck", arcs[e / 2]).
91 91
      attribute("creator", "lemon library").
92 92
      run();
93 93

	
94 94
  } catch (DataFormatError& error) {
95 95
    std::cerr << error.what() << std::endl;
96 96
  }
97 97

	
98 98
  try {
99 99

	
100 100
    typedef SmartDigraph Digraph;
101 101
    typedef Digraph::Node Node;
102 102
    typedef Digraph::Arc Arc;
103 103
    typedef Digraph::ArcIt ArcIt;
104 104

	
105 105
    typedef Digraph::NodeMap<int> LabelMap;
106 106
    typedef Digraph::NodeMap<int> PotentialMap;
107 107
    typedef Digraph::ArcMap<int> CapacityMap;
108 108
    typedef Digraph::ArcMap<std::string> NameMap;
109 109

	
110 110
    Digraph digraph;
111 111
    LabelMap label(digraph);
112 112
    PotentialMap potential(digraph);
113 113
    CapacityMap capacity(digraph);
114 114
    NameMap name(digraph);
115 115

	
116 116
    Node s, t;
117 117
    Arc a;
118 118
    
119 119
    std::string creator;
120 120

	
121 121
    for (int i = 0; i < n; ++i) {
122 122
      Node node = digraph.addNode();
123 123
      label[node] = i;
124 124
    }
125 125
    
126 126
    DigraphReader<Digraph>(ss, digraph).
127 127
      useNodes(label).
128 128
      nodeMap("potential", potential).
129 129
      arcMap("capacity", capacity).
130 130
      arcMap("name", name).
131 131
      node("source", s).
132 132
      node("target", t).
133 133
      arc("bottleneck", a).
134 134
      attribute("creator", creator).
135 135
      run();
136 136

	
Ignore white space 6 line context
... ...
@@ -10,193 +10,199 @@
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_ASSERT_H
20 20
#define LEMON_ASSERT_H
21 21

	
22 22
/// \ingroup exceptions
23 23
/// \file
24 24
/// \brief Extended assertion handling
25 25

	
26 26
#include <lemon/error.h>
27 27

	
28 28
namespace lemon {
29 29

	
30 30
  inline void assert_fail_log(const char *file, int line, const char *function,
31 31
			      const char *message, const char *assertion)
32 32
  {
33 33
    std::cerr << file << ":" << line << ": ";
34 34
    if (function)
35 35
      std::cerr << function << ": ";
36 36
    std::cerr << message;
37 37
    if (assertion)
38 38
      std::cerr << " (assertion '" << assertion << "' failed)";
39 39
    std::cerr << std::endl;
40 40
  }
41 41

	
42 42
  inline void assert_fail_abort(const char *file, int line,
43 43
				const char *function, const char* message,
44 44
				const char *assertion)
45 45
  {
46 46
    assert_fail_log(file, line, function, message, assertion);
47 47
    std::abort();
48 48
  }
49 49

	
50 50
  namespace _assert_bits {
51 51
    
52 52
    
53 53
    inline const char* cstringify(const std::string& str) {
54 54
      return str.c_str();
55 55
    }
56 56

	
57 57
    inline const char* cstringify(const char* str) {
58 58
      return str;
59 59
    }    
60 60
  }
61 61
}
62 62

	
63 63
#endif // LEMON_ASSERT_H
64 64

	
65 65
#undef LEMON_ASSERT
66 66
#undef LEMON_FIXME
67 67
#undef LEMON_DEBUG
68 68

	
69 69
#if (defined(LEMON_ASSERT_LOG) ? 1 : 0) +		\
70 70
  (defined(LEMON_ASSERT_ABORT) ? 1 : 0) +		\
71 71
  (defined(LEMON_ASSERT_CUSTOM) ? 1 : 0) > 1
72 72
#error "LEMON assertion system is not set properly"
73 73
#endif
74 74

	
75 75
#if ((defined(LEMON_ASSERT_LOG) ? 1 : 0) +		\
76 76
     (defined(LEMON_ASSERT_ABORT) ? 1 : 0) +		\
77 77
     (defined(LEMON_ASSERT_CUSTOM) ? 1 : 0) == 1 ||	\
78 78
     defined(LEMON_ENABLE_ASSERTS)) &&			\
79 79
  (defined(LEMON_DISABLE_ASSERTS) ||			\
80 80
   defined(NDEBUG))
81 81
#error "LEMON assertion system is not set properly"
82 82
#endif
83 83

	
84 84

	
85 85
#if defined LEMON_ASSERT_LOG
86 86
#  undef LEMON_ASSERT_HANDLER
87 87
#  define LEMON_ASSERT_HANDLER ::lemon::assert_fail_log
88 88
#elif defined LEMON_ASSERT_ABORT
89 89
#  undef LEMON_ASSERT_HANDLER
90 90
#  define LEMON_ASSERT_HANDLER ::lemon::assert_fail_abort
91 91
#elif defined LEMON_ASSERT_CUSTOM
92 92
#  undef LEMON_ASSERT_HANDLER
93 93
#  ifndef LEMON_CUSTOM_ASSERT_HANDLER
94 94
#    error "LEMON_CUSTOM_ASSERT_HANDLER is not set"
95 95
#  endif
96 96
#  define LEMON_ASSERT_HANDLER LEMON_CUSTOM_ASSERT_HANDLER
97 97
#elif defined LEMON_DISABLE_ASSERTS
98 98
#  undef LEMON_ASSERT_HANDLER
99 99
#elif defined NDEBUG
100 100
#  undef LEMON_ASSERT_HANDLER
101 101
#else
102 102
#  define LEMON_ASSERT_HANDLER ::lemon::assert_fail_abort
103 103
#endif
104 104

	
105 105
#ifndef LEMON_FUNCTION_NAME
106
#  define LEMON_FUNCTION_NAME (__PRETTY_FUNCTION__)
106
#  if defined __GNUC__
107
#    define LEMON_FUNCTION_NAME (__PRETTY_FUNCTION__)
108
#  elif defined _MSC_VER
109
#    define LEMON_FUNCTION_NAME (__FUNCSIG__)
110
#  else
111
#    define LEMON_FUNCTION_NAME (__func__)
112
#  endif
107 113
#endif
108 114

	
109 115
#ifdef DOXYGEN
110 116

	
111 117
/// \ingroup exceptions
112 118
///
113 119
/// \brief Macro for assertion with customizable message
114 120
///
115 121
/// Macro for assertion with customizable message.  \param exp An
116 122
/// expression that must be convertible to \c bool.  If it is \c
117 123
/// false, then an assertion is raised. The concrete behaviour depends
118 124
/// on the settings of the assertion system.  \param msg A <tt>const
119 125
/// char*</tt> parameter, which can be used to provide information
120 126
/// about the circumstances of the failed assertion.
121 127
///
122 128
/// The assertions are enabled in the default behaviour.
123 129
/// You can disable them with the following code:
124 130
/// \code
125 131
/// #define LEMON_DISABLE_ASSERTS
126 132
/// \endcode
127 133
/// or with compilation parameters:
128 134
/// \code
129 135
/// g++ -DLEMON_DISABLE_ASSERTS
130 136
/// make CXXFLAGS='-DLEMON_DISABLE_ASSERTS'
131 137
/// \endcode
132 138
/// The checking is also disabled when the standard macro \c NDEBUG is defined.
133 139
/// 
134 140
/// The LEMON assertion system has a wide range of customization
135 141
/// properties. As a default behaviour the failed assertion prints a
136 142
/// short log message to the standard error and aborts the execution.
137 143
///
138 144
/// The following modes can be used in the assertion system: 
139 145
///
140 146
/// - \c LEMON_ASSERT_LOG The failed assertion prints a short log
141 147
///   message to the standard error and continues the execution.
142 148
/// - \c LEMON_ASSERT_ABORT This mode is similar to the \c
143 149
///   LEMON_ASSERT_LOG, but it aborts the program. It is the default
144 150
///   behaviour.
145 151
/// - \c LEMON_ASSERT_CUSTOM The user can define own assertion handler
146 152
///   function.
147 153
///   \code
148 154
///     void custom_assert_handler(const char* file, int line, const char* function,
149 155
///                                const char* message, const char* assertion);
150 156
///   \endcode
151 157
///   The name of the function should be defined as the \c
152 158
///   LEMON_CUSTOM_ASSERT_HANDLER macro name. 
153 159
///   \code
154 160
///     #define LEMON_CUSTOM_ASSERT_HANDLER custom_assert_handler
155 161
///   \endcode
156 162
///   Whenever an assertion is occured, the custom assertion
157 163
///   handler is called with appropiate parameters.
158 164
///
159 165
/// The assertion mode can also be changed within one compilation unit.
160 166
/// If the macros are redefined with other settings and the
161 167
/// \ref lemon/assert.h "assert.h" file is reincluded, then the
162 168
/// behaviour is changed appropiately to the new settings.
163 169
#  define LEMON_ASSERT(exp, msg)					\
164 170
  (static_cast<void> (!!(exp) ? 0 : (					\
165 171
    LEMON_ASSERT_HANDLER(__FILE__, __LINE__,				\
166 172
			 LEMON_FUNCTION_NAME,				\
167 173
			 ::lemon::_assert_bits::cstringify(msg), #exp), 0)))
168 174

	
169 175
/// \ingroup exceptions
170 176
///
171 177
/// \brief Macro for mark not yet implemented features.
172 178
///
173 179
/// Macro for mark not yet implemented features and outstanding bugs.
174 180
/// It is close to be the shortcut of the following code:
175 181
/// \code
176 182
///   LEMON_ASSERT(false, msg);
177 183
/// \endcode
178 184
///
179 185
/// \see LEMON_ASSERT 
180 186
#  define LEMON_FIXME(msg)						\
181 187
  (LEMON_ASSERT_HANDLER(__FILE__, __LINE__, LEMON_FUNCTION_NAME,	\
182 188
			::lemon::_assert_bits::cstringify(msg),		\
183 189
			static_cast<const char*>(0)))
184 190

	
185 191
/// \ingroup exceptions
186 192
///
187 193
/// \brief Macro for internal assertions
188 194
///
189 195
/// Macro for internal assertions, it is used in the library to check
190 196
/// the consistency of results of algorithms, several pre- and
191 197
/// postconditions and invariants. The checking is disabled by
192 198
/// default, but it can be turned on with the macro \c
193 199
/// LEMON_ENABLE_DEBUG.
194 200
/// \code
195 201
/// #define LEMON_ENABLE_DEBUG
196 202
/// \endcode
197 203
/// or with compilation parameters:
198 204
/// \code
199 205
/// g++ -DLEMON_ENABLE_DEBUG
200 206
/// make CXXFLAGS='-DLEMON_ENABLE_DEBUG'
201 207
/// \endcode
202 208
///
Ignore white space 6 line context
1 1
/* -*- C++ -*-
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
#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
#define WIN32_LEAN_AND_MEAN
33
#define NOMINMAX
32 34
#include<windows.h>
33 35
#endif
34 36

	
35 37
#include<lemon/math.h>
36 38
#include<lemon/bits/invalid.h>
37 39
#include<lemon/dim2.h>
38 40
#include<lemon/maps.h>
39 41
#include<lemon/color.h>
40 42
#include<lemon/bits/bezier.h>
41 43

	
42 44

	
43 45
///\ingroup eps_io
44 46
///\file
45 47
///\brief A well configurable tool for visualizing graphs
46 48

	
47 49
namespace lemon {
48 50

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

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

	
79 81
  const Graph &g;
80 82

	
81 83
  std::ostream& os;
82 84
  
83 85
  typedef ConstMap<typename Graph::Node,dim2::Point<double> > CoordsMapType;
84 86
  CoordsMapType _coords;
85 87
  ConstMap<typename Graph::Node,double > _nodeSizes;
86 88
  ConstMap<typename Graph::Node,int > _nodeShapes;
87 89

	
88 90
  ConstMap<typename Graph::Node,Color > _nodeColors;
89 91
  ConstMap<typename Graph::Arc,Color > _arcColors;
90 92

	
91 93
  ConstMap<typename Graph::Arc,double > _arcWidths;
92 94

	
93 95
  double _arcWidthScale;
94 96
  
95 97
  double _nodeScale;
96 98
  double _xBorder, _yBorder;
97 99
  double _scale;
98 100
  double _nodeBorderQuotient;
99 101
  
100 102
  bool _drawArrows;
101 103
  double _arrowLength, _arrowWidth;
102 104
  
103 105
  bool _showNodes, _showArcs;
104 106

	
105 107
  bool _enableParallel;
106 108
  double _parArcDist;
107 109

	
108 110
  bool _showNodeText;
109 111
  ConstMap<typename Graph::Node,bool > _nodeTexts;  
110 112
  double _nodeTextSize;
111 113

	
112 114
  bool _showNodePsText;
113 115
  ConstMap<typename Graph::Node,bool > _nodePsTexts;  
114 116
  char *_nodePsTextsPreamble;
115 117
  
116 118
  bool _undirected;
117 119

	
118 120
  bool _pleaseRemoveOsStream;
119 121

	
120 122
  bool _scaleToA4;
121 123

	
122 124
  std::string _title;
123 125
  std::string _copyright;
124 126

	
125 127
  enum NodeTextColorType 
126 128
    { DIST_COL=0, DIST_BW=1, CUST_COL=2, SAME_COL=3 } _nodeTextColorType;
127 129
  ConstMap<typename Graph::Node,Color > _nodeTextColors;
Ignore white space 6 line context
... ...
@@ -810,242 +810,249 @@
810 810
      ///Conversion to Digraph::Arc
811 811
      operator const Arc&() const {
812 812
        return path->nth(idx);
813 813
      }
814 814

	
815 815
      /// Next arc
816 816
      ArcIt& operator++() { 
817 817
        ++idx;
818 818
        if (idx >= path->length()) idx = -1; 
819 819
        return *this; 
820 820
      }
821 821

	
822 822
      /// Comparison operator
823 823
      bool operator==(const ArcIt& e) const { return idx==e.idx; }
824 824
      /// Comparison operator
825 825
      bool operator!=(const ArcIt& e) const { return idx!=e.idx; }
826 826
      /// Comparison operator
827 827
      bool operator<(const ArcIt& e) const { return idx<e.idx; }
828 828

	
829 829
    private:
830 830
      const StaticPath *path;
831 831
      int idx;
832 832
    };
833 833

	
834 834
    /// \brief The nth arc.
835 835
    ///
836 836
    /// \pre n is in the [0..length() - 1] range
837 837
    const Arc& nth(int n) const {
838 838
      return arcs[n];
839 839
    }
840 840

	
841 841
    /// \brief The arc iterator pointing to the nth arc.
842 842
    ArcIt nthIt(int n) const {
843 843
      return ArcIt(*this, n);
844 844
    }
845 845

	
846 846
    /// \brief The length of the path.
847 847
    int length() const { return len; }
848 848

	
849 849
    /// \brief Return true when the path is empty.
850 850
    int empty() const { return len == 0; }
851 851

	
852 852
    /// \break Erase all arcs in the digraph.
853 853
    void clear() {
854 854
      len = 0;
855 855
      if (arcs) delete[] arcs;
856 856
      arcs = 0;
857 857
    }
858 858

	
859 859
    /// \brief The first arc of the path.
860 860
    const Arc& front() const {
861 861
      return arcs[0];
862 862
    }
863 863

	
864 864
    /// \brief The last arc of the path.
865 865
    const Arc& back() const {
866 866
      return arcs[len - 1];
867 867
    }
868 868

	
869 869

	
870 870
    typedef True BuildTag;
871 871

	
872 872
    template <typename CPath>
873 873
    void build(const CPath& path) {
874 874
      len = path.length();
875 875
      arcs = new Arc[len];
876 876
      int index = 0;
877 877
      for (typename CPath::ArcIt it(path); it != INVALID; ++it) {
878 878
        arcs[index] = it;
879 879
        ++index;
880 880
      }
881 881
    }
882 882

	
883 883
    template <typename CPath>
884 884
    void buildRev(const CPath& path) {
885 885
      len = path.length();
886 886
      arcs = new Arc[len];
887 887
      int index = len;
888 888
      for (typename CPath::RevArcIt it(path); it != INVALID; ++it) {
889 889
        --index;
890 890
        arcs[index] = it;
891 891
      }
892 892
    }
893 893

	
894 894
  private:
895 895
    int len;
896 896
    Arc* arcs;
897 897
  };
898 898

	
899 899
  ///////////////////////////////////////////////////////////////////////
900 900
  // Additional utilities
901 901
  ///////////////////////////////////////////////////////////////////////
902 902

	
903 903
  namespace _path_bits {
904 904

	
905 905
    template <typename Path, typename Enable = void>
906
    struct RevTagIndicator {
906
    struct RevPathTagIndicator {
907 907
      static const bool value = false;
908 908
    };
909 909

	
910
    template <typename Digraph>
911
    struct RevTagIndicator<
912
      Digraph, 
913
      typename enable_if<typename Digraph::RevTag, void>::type
910
    template <typename Path>
911
    struct RevPathTagIndicator<
912
      Path, 
913
      typename enable_if<typename Path::RevPathTag, void>::type
914
      > {
915
      static const bool value = true;
916
    };
917

	
918
    template <typename Path, typename Enable = void>
919
    struct BuildTagIndicator {
920
      static const bool value = false;
921
    };
922

	
923
    template <typename Path>
924
    struct BuildTagIndicator<
925
      Path, 
926
      typename enable_if<typename Path::BuildTag, void>::type
914 927
    > {
915 928
      static const bool value = true;
916 929
    };
917 930

	
918 931
    template <typename Target, typename Source,
919
              typename BuildEnable = void, typename RevEnable = void>
932
	      bool buildEnable = BuildTagIndicator<Target>::value, 
933
	      bool revEnable = RevPathTagIndicator<Source>::value>
920 934
    struct PathCopySelector {
921 935
      static void copy(Target& target, const Source& source) {
922 936
        target.clear();
923 937
        for (typename Source::ArcIt it(source); it != INVALID; ++it) {
924 938
          target.addBack(it);
925 939
        }
926 940
      }
927 941
    };
928 942

	
929
    template <typename Target, typename Source, typename BuildEnable>
930
    struct PathCopySelector<
931
      Target, Source, BuildEnable, 
932
      typename enable_if<typename Source::RevPathTag, void>::type> {
943
    template <typename Target, typename Source>
944
    struct PathCopySelector<Target, Source, false, true> {
933 945
      static void copy(Target& target, const Source& source) {
934 946
        target.clear();
935 947
        for (typename Source::RevArcIt it(source); it != INVALID; ++it) {
936 948
          target.addFront(it);
937 949
        }
938 950
      }
939 951
    };
940 952

	
941
    template <typename Target, typename Source, typename RevEnable>
942
    struct PathCopySelector<
943
      Target, Source, 
944
      typename enable_if<typename Target::BuildTag, void>::type, RevEnable> {
953
    template <typename Target, typename Source>
954
    struct PathCopySelector<Target, Source, true, false> {
945 955
      static void copy(Target& target, const Source& source) {
946 956
        target.clear();
947 957
        target.build(source);
948 958
      }
949 959
    };
950 960

	
951 961
    template <typename Target, typename Source>
952
    struct PathCopySelector<
953
      Target, Source, 
954
      typename enable_if<typename Target::BuildTag, void>::type,
955
      typename enable_if<typename Source::RevPathTag, void>::type> {
962
    struct PathCopySelector<Target, Source, true, true> {
956 963
      static void copy(Target& target, const Source& source) {
957 964
        target.clear();
958 965
        target.buildRev(source);
959 966
      }
960 967
    };
961 968

	
962 969
  }
963 970

	
964 971

	
965 972
  /// \brief Make a copy of a path.
966 973
  ///
967 974
  ///  This function makes a copy of a path.
968 975
  template <typename Target, typename Source>
969 976
  void copyPath(Target& target, const Source& source) {
970 977
    checkConcept<concepts::PathDumper<typename Source::Digraph>, Source>();
971 978
    _path_bits::PathCopySelector<Target, Source>::copy(target, source);
972 979
  }
973 980

	
974 981
  /// \brief Check the consistency of a path.
975 982
  ///
976 983
  /// This function checks that the target of each arc is the same
977 984
  /// as the source of the next one. 
978 985
  /// 
979 986
  template <typename Digraph, typename Path>
980 987
  bool checkPath(const Digraph& digraph, const Path& path) {
981 988
    typename Path::ArcIt it(path);
982 989
    if (it == INVALID) return true;
983 990
    typename Digraph::Node node = digraph.target(it);
984 991
    ++it;
985 992
    while (it != INVALID) {
986 993
      if (digraph.source(it) != node) return false;
987 994
      node = digraph.target(it);
988 995
      ++it;
989 996
    }
990 997
    return true;
991 998
  }
992 999

	
993 1000
  /// \brief The source of a path
994 1001
  ///
995 1002
  /// This function returns the source of the given path.
996 1003
  template <typename Digraph, typename Path>
997 1004
  typename Digraph::Node pathSource(const Digraph& digraph, const Path& path) {
998 1005
    return digraph.source(path.front());
999 1006
  }
1000 1007

	
1001 1008
  /// \brief The target of a path
1002 1009
  ///
1003 1010
  /// This function returns the target of the given path.
1004 1011
  template <typename Digraph, typename Path>
1005 1012
  typename Digraph::Node pathTarget(const Digraph& digraph, const Path& path) {
1006 1013
    return digraph.target(path.back());
1007 1014
  }
1008 1015

	
1009 1016
  /// \brief Class which helps to iterate through the nodes of a path
1010 1017
  ///
1011 1018
  /// In a sense, the path can be treated as a list of arcs. The
1012 1019
  /// lemon path type stores only this list. As a consequence, it
1013 1020
  /// cannot enumerate the nodes in the path and the zero length paths
1014 1021
  /// cannot have a source node.
1015 1022
  ///
1016 1023
  /// This class implements the node iterator of a path structure. To
1017 1024
  /// provide this feature, the underlying digraph should be passed to
1018 1025
  /// the constructor of the iterator.
1019 1026
  template <typename Path>
1020 1027
  class PathNodeIt {
1021 1028
  private:
1022 1029
    const typename Path::Digraph *_digraph;
1023 1030
    typename Path::ArcIt _it;
1024 1031
    typename Path::Digraph::Node _nd;
1025 1032

	
1026 1033
  public:
1027 1034

	
1028 1035
    typedef typename Path::Digraph Digraph;
1029 1036
    typedef typename Digraph::Node Node;
1030 1037
    
1031 1038
    /// Default constructor
1032 1039
    PathNodeIt() {}
1033 1040
    /// Invalid constructor
1034 1041
    PathNodeIt(Invalid) 
1035 1042
      : _digraph(0), _it(INVALID), _nd(INVALID) {}
1036 1043
    /// Constructor
1037 1044
    PathNodeIt(const Digraph& digraph, const Path& path) 
1038 1045
      : _digraph(&digraph), _it(path) {
1039 1046
      _nd = (_it != INVALID ? _digraph->source(_it) : INVALID);
1040 1047
    }
1041 1048
    /// Constructor
1042 1049
    PathNodeIt(const Digraph& digraph, const Path& path, const Node& src) 
1043 1050
      : _digraph(&digraph), _it(path), _nd(src) {}
1044 1051

	
1045 1052
    ///Conversion to Digraph::Node
1046 1053
    operator Node() const {
1047 1054
      return _nd;
1048 1055
    }
1049 1056

	
1050 1057
    /// Next node
1051 1058
    PathNodeIt& operator++() {
Ignore white space 6 line context
1 1
/* -*- C++ -*-
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
#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
#define WIN32_LEAN_AND_MEAN
28
#define NOMINMAX
27 29
#include <windows.h>
28 30
#include <cmath>
29 31
#else
30 32
#include <sys/times.h>
31 33
#include <sys/time.h>
32 34
#endif
33 35

	
36
#include <string>
34 37
#include <fstream>
35 38
#include <iostream>
36 39

	
37 40
namespace lemon {
38 41

	
39 42
  /// \addtogroup timecount
40 43
  /// @{
41 44

	
42 45
  /// A class to store (cpu)time instances.
43 46

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

	
59 62
  class TimeStamp
60 63
  {
61 64
    double utime;
62 65
    double stime;
63 66
    double cutime;
64 67
    double cstime;
65 68
    double rtime;
66 69
  
67 70
    void _reset() { 
68 71
      utime = stime = cutime = cstime = rtime = 0;
69 72
    }
70 73

	
71 74
  public:
72 75

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

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

	
92 95
      FILETIME system;
93 96
      GetSystemTimeAsFileTime(&system);
94 97
      rtime = ch * system.dwHighDateTime + cl * system.dwLowDateTime;
95 98

	
96 99
      FILETIME create, exit, kernel, user;
97 100
      if (GetProcessTimes(GetCurrentProcess(),&create, &exit, &kernel, &user)) {
98 101
	utime = ch * user.dwHighDateTime + cl * user.dwLowDateTime;
99 102
	stime = ch * kernel.dwHighDateTime + cl * kernel.dwLowDateTime;
100 103
	cutime = 0;
101 104
	cstime = 0;
102 105
      } else {
103 106
	rtime = 0;
104 107
	utime = 0;
105 108
	stime = 0;
106 109
	cutime = 0;
107 110
	cstime = 0;
108 111
      }
109 112
#endif      
110 113
    }
111 114
  
112 115
    /// Constructor initializing with zero
113 116
    TimeStamp()
114 117
    { _reset(); }
115 118
    ///Constructor initializing with the current time values of the process
116 119
    TimeStamp(void *) { stamp();}
117 120
  
118 121
    ///Set every time value to zero
119 122
    TimeStamp &reset() {_reset();return *this;}
120 123

	
121 124
    ///\e
122 125
    TimeStamp &operator+=(const TimeStamp &b)
123 126
    {
124 127
      utime+=b.utime;
125 128
      stime+=b.stime;
126 129
      cutime+=b.cutime;
127 130
      cstime+=b.cstime;
128 131
      rtime+=b.rtime;
129 132
      return *this;
Ignore white space 6 line context
1
all:
2
	$(MAKE) -C ..
Ignore white space 6 line context
1
all:
2
	$(MAKE) -C ..
Ignore white space 6 line context
1
all:
2
	$(MAKE) -C ..
Ignore white space 192 line context
1
all:
2
	$(MAKE) -C ..
Ignore white space 6 line context
1
all:
2
	$(MAKE) -C ..
Ignore white space 6 line context
1
all:
2
	$(MAKE) -C ..
0 comments (0 inline)