0
24
0
2
2
1
1
1
1
1
1
4
4
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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 |
/** |
| 20 | 20 |
\dir demo |
| 21 | 21 |
\brief A collection of demo applications. |
| 22 | 22 |
|
| 23 | 23 |
This directory contains several simple demo applications, mainly |
| 24 | 24 |
for educational purposes. |
| 25 | 25 |
*/ |
| 26 | 26 |
|
| 27 | 27 |
/** |
| 28 | 28 |
\dir doc |
| 29 | 29 |
\brief Auxiliary (and the whole generated) documentation. |
| ... | ... |
@@ -50,28 +50,28 @@ |
| 50 | 50 |
/** |
| 51 | 51 |
\dir lemon |
| 52 | 52 |
\brief Base include directory of LEMON. |
| 53 | 53 |
|
| 54 | 54 |
This is the base directory of LEMON includes, so each include file must be |
| 55 | 55 |
prefixed with this, e.g. |
| 56 | 56 |
\code |
| 57 | 57 |
#include<lemon/list_graph.h> |
| 58 | 58 |
#include<lemon/dijkstra.h> |
| 59 | 59 |
\endcode |
| 60 | 60 |
*/ |
| 61 | 61 |
|
| 62 | 62 |
/** |
| 63 | 63 |
\dir concepts |
| 64 | 64 |
\brief Concept descriptors and checking classes. |
| 65 | 65 |
|
| 66 | 66 |
This directory contains the concept descriptors and concept checking tools. |
| 67 | 67 |
For more information see the \ref concept "Concepts" module. |
| 68 | 68 |
*/ |
| 69 | 69 |
|
| 70 | 70 |
/** |
| 71 | 71 |
\dir bits |
| 72 | 72 |
\brief Auxiliary tools for implementation. |
| 73 | 73 |
|
| 74 |
This directory contains some auxiliary classes for implementing graphs, |
|
| 74 |
This directory contains some auxiliary classes for implementing graphs, |
|
| 75 | 75 |
maps and some other classes. |
| 76 | 76 |
As a user you typically don't have to deal with these files. |
| 77 | 77 |
*/ |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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 |
/** |
| 20 | 20 |
@defgroup datas Data Structures |
| 21 | 21 |
This group describes the several data structures implemented in LEMON. |
| 22 | 22 |
*/ |
| 23 | 23 |
|
| 24 | 24 |
/** |
| 25 | 25 |
@defgroup graphs Graph Structures |
| 26 | 26 |
@ingroup datas |
| 27 | 27 |
\brief Graph structures implemented in LEMON. |
| 28 | 28 |
|
| 29 | 29 |
The implementation of combinatorial algorithms heavily relies on |
| ... | ... |
@@ -282,39 +282,39 @@ |
| 282 | 282 |
should compile with these classes. (Though it will not run properly, |
| 283 | 283 |
of course.) In this way it is easily to check if an algorithm |
| 284 | 284 |
doesn't use any extra feature of a certain implementation. |
| 285 | 285 |
|
| 286 | 286 |
- The concept descriptor classes also provide a <em>checker class</em> |
| 287 | 287 |
that makes it possible to check whether a certain implementation of a |
| 288 | 288 |
concept indeed provides all the required features. |
| 289 | 289 |
|
| 290 | 290 |
- Finally, They can serve as a skeleton of a new implementation of a concept. |
| 291 | 291 |
*/ |
| 292 | 292 |
|
| 293 | 293 |
/** |
| 294 | 294 |
@defgroup graph_concepts Graph Structure Concepts |
| 295 | 295 |
@ingroup concept |
| 296 | 296 |
\brief Skeleton and concept checking classes for graph structures |
| 297 | 297 |
|
| 298 | 298 |
This group describes the skeletons and concept checking classes of LEMON's |
| 299 | 299 |
graph structures and helper classes used to implement these. |
| 300 | 300 |
*/ |
| 301 | 301 |
|
| 302 | 302 |
/** |
| 303 | 303 |
@defgroup map_concepts Map Concepts |
| 304 | 304 |
@ingroup concept |
| 305 | 305 |
\brief Skeleton and concept checking classes for maps |
| 306 |
|
|
| 306 |
|
|
| 307 | 307 |
This group describes the skeletons and concept checking classes of maps. |
| 308 | 308 |
*/ |
| 309 | 309 |
|
| 310 | 310 |
/** |
| 311 | 311 |
\anchor demoprograms |
| 312 | 312 |
|
| 313 | 313 |
@defgroup demos Demo programs |
| 314 | 314 |
|
| 315 | 315 |
Some demo programs are listed here. Their full source codes can be found in |
| 316 | 316 |
the \c demo subdirectory of the source tree. |
| 317 | 317 |
|
| 318 | 318 |
It order to compile them, use <tt>--enable-demo</tt> configure option when |
| 319 | 319 |
build the library. |
| 320 | 320 |
*/ |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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 |
namespace lemon {
|
| 20 | 20 |
/*! |
| 21 | 21 |
|
| 22 | 22 |
|
| 23 | 23 |
|
| 24 | 24 |
\page lgf-format LEMON Graph Format (LGF) |
| 25 | 25 |
|
| 26 | 26 |
The \e LGF is a <em>column oriented</em> |
| 27 | 27 |
file format for storing graphs and associated data like |
| 28 | 28 |
node and edge maps. |
| 29 | 29 |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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 Some basic non-inline functions and static global data. |
| 21 | 21 |
|
| 22 | 22 |
#include<lemon/tolerance.h> |
| 23 | 23 |
#include<lemon/core.h> |
| 24 | 24 |
namespace lemon {
|
| 25 | 25 |
|
| 26 | 26 |
float Tolerance<float>::def_epsilon = static_cast<float>(1e-4); |
| 27 | 27 |
double Tolerance<double>::def_epsilon = 1e-10; |
| 28 | 28 |
long double Tolerance<long double>::def_epsilon = 1e-14; |
| 29 | 29 |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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_BITS_DEFAULT_MAP_H |
| 20 | 20 |
#define LEMON_BITS_DEFAULT_MAP_H |
| 21 | 21 |
|
| 22 | 22 |
#include <lemon/config.h> |
| 23 | 23 |
#include <lemon/bits/array_map.h> |
| 24 | 24 |
#include <lemon/bits/vector_map.h> |
| 25 | 25 |
//#include <lemon/bits/debug_map.h> |
| 26 | 26 |
|
| 27 | 27 |
//\ingroup graphbits |
| 28 | 28 |
//\file |
| 29 | 29 |
//\brief Graph maps that construct and destruct their elements dynamically. |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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_BITS_MAP_EXTENDER_H |
| 20 | 20 |
#define LEMON_BITS_MAP_EXTENDER_H |
| 21 | 21 |
|
| 22 | 22 |
#include <iterator> |
| 23 | 23 |
|
| 24 | 24 |
#include <lemon/bits/traits.h> |
| 25 | 25 |
|
| 26 | 26 |
#include <lemon/concept_check.h> |
| 27 | 27 |
#include <lemon/concepts/maps.h> |
| 28 | 28 |
|
| 29 | 29 |
//\file |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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_BITS_PRED_MAP_PATH_H |
| 20 | 20 |
#define LEMON_BITS_PRED_MAP_PATH_H |
| 21 | 21 |
|
| 22 | 22 |
namespace lemon {
|
| 23 | 23 |
|
| 24 | 24 |
template <typename _Digraph, typename _PredMap> |
| 25 | 25 |
class PredMapPath {
|
| 26 | 26 |
public: |
| 27 | 27 |
typedef True RevPathTag; |
| 28 | 28 |
|
| 29 | 29 |
typedef _Digraph Digraph; |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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 Some basic non-inline functions and static global data. |
| 21 | 21 |
|
| 22 | 22 |
#include<lemon/bits/windows.h> |
| 23 | 23 |
|
| 24 | 24 |
#ifdef WIN32 |
| 25 | 25 |
#ifndef WIN32_LEAN_AND_MEAN |
| 26 | 26 |
#define WIN32_LEAN_AND_MEAN |
| 27 | 27 |
#endif |
| 28 | 28 |
#ifndef NOMINMAX |
| 29 | 29 |
#define NOMINMAX |
| ... | ... |
@@ -75,49 +75,49 @@ |
| 75 | 75 |
cstime = 0; |
| 76 | 76 |
} |
| 77 | 77 |
#else |
| 78 | 78 |
timeval tv; |
| 79 | 79 |
gettimeofday(&tv, 0); |
| 80 | 80 |
rtime=tv.tv_sec+double(tv.tv_usec)/1e6; |
| 81 | 81 |
|
| 82 | 82 |
tms ts; |
| 83 | 83 |
double tck=sysconf(_SC_CLK_TCK); |
| 84 | 84 |
times(&ts); |
| 85 | 85 |
utime=ts.tms_utime/tck; |
| 86 | 86 |
stime=ts.tms_stime/tck; |
| 87 | 87 |
cutime=ts.tms_cutime/tck; |
| 88 | 88 |
cstime=ts.tms_cstime/tck; |
| 89 | 89 |
#endif |
| 90 | 90 |
} |
| 91 | 91 |
|
| 92 | 92 |
std::string getWinFormattedDate() |
| 93 | 93 |
{
|
| 94 | 94 |
std::ostringstream os; |
| 95 | 95 |
#ifdef WIN32 |
| 96 | 96 |
SYSTEMTIME time; |
| 97 | 97 |
GetSystemTime(&time); |
| 98 | 98 |
char buf1[11], buf2[9], buf3[5]; |
| 99 |
|
|
| 99 |
if (GetDateFormat(MY_LOCALE, 0, &time, |
|
| 100 | 100 |
("ddd MMM dd"), buf1, 11) &&
|
| 101 | 101 |
GetTimeFormat(MY_LOCALE, 0, &time, |
| 102 | 102 |
("HH':'mm':'ss"), buf2, 9) &&
|
| 103 | 103 |
GetDateFormat(MY_LOCALE, 0, &time, |
| 104 | 104 |
("yyyy"), buf3, 5)) {
|
| 105 | 105 |
os << buf1 << ' ' << buf2 << ' ' << buf3; |
| 106 | 106 |
} |
| 107 | 107 |
else os << "unknown"; |
| 108 | 108 |
#else |
| 109 | 109 |
timeval tv; |
| 110 | 110 |
gettimeofday(&tv, 0); |
| 111 | 111 |
|
| 112 | 112 |
char cbuf[26]; |
| 113 | 113 |
ctime_r(&tv.tv_sec,cbuf); |
| 114 | 114 |
os << cbuf; |
| 115 | 115 |
#endif |
| 116 | 116 |
return os.str(); |
| 117 | 117 |
} |
| 118 | 118 |
|
| 119 | 119 |
int getWinRndSeed() |
| 120 | 120 |
{
|
| 121 | 121 |
#ifdef WIN32 |
| 122 | 122 |
FILETIME time; |
| 123 | 123 |
GetSystemTimeAsFileTime(&time); |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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_CORE_H |
| 20 | 20 |
#define LEMON_CORE_H |
| 21 | 21 |
|
| 22 | 22 |
#include <vector> |
| 23 | 23 |
#include <algorithm> |
| 24 | 24 |
|
| 25 | 25 |
#include <lemon/config.h> |
| 26 | 26 |
#include <lemon/bits/enable_if.h> |
| 27 | 27 |
#include <lemon/bits/traits.h> |
| 28 | 28 |
#include <lemon/assert.h> |
| 29 | 29 |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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_DFS_H |
| 20 | 20 |
#define LEMON_DFS_H |
| 21 | 21 |
|
| 22 | 22 |
///\ingroup search |
| 23 | 23 |
///\file |
| 24 | 24 |
///\brief DFS algorithm. |
| 25 | 25 |
|
| 26 | 26 |
#include <lemon/list_graph.h> |
| 27 | 27 |
#include <lemon/bits/path_dump.h> |
| 28 | 28 |
#include <lemon/core.h> |
| 29 | 29 |
#include <lemon/error.h> |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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> |
| ... | ... |
@@ -370,49 +370,49 @@ |
| 370 | 370 |
|
| 371 | 371 |
virtual void process(std::istream& is, int& line_num) {
|
| 372 | 372 |
_functor(is, line_num); |
| 373 | 373 |
char c; |
| 374 | 374 |
std::string line; |
| 375 | 375 |
while (is.get(c) && c != '@') {
|
| 376 | 376 |
if (c == '\n') {
|
| 377 | 377 |
++line_num; |
| 378 | 378 |
} else if (!isWhiteSpace(c)) {
|
| 379 | 379 |
getline(is, line); |
| 380 | 380 |
++line_num; |
| 381 | 381 |
} |
| 382 | 382 |
} |
| 383 | 383 |
if (is) is.putback(c); |
| 384 | 384 |
else if (is.eof()) is.clear(); |
| 385 | 385 |
} |
| 386 | 386 |
}; |
| 387 | 387 |
|
| 388 | 388 |
} |
| 389 | 389 |
|
| 390 | 390 |
template <typename Digraph> |
| 391 | 391 |
class DigraphReader; |
| 392 | 392 |
|
| 393 | 393 |
template <typename Digraph> |
| 394 |
DigraphReader<Digraph> digraphReader(Digraph& digraph, |
|
| 394 |
DigraphReader<Digraph> digraphReader(Digraph& digraph, |
|
| 395 | 395 |
std::istream& is = std::cin); |
| 396 | 396 |
template <typename Digraph> |
| 397 | 397 |
DigraphReader<Digraph> digraphReader(Digraph& digraph, const std::string& fn); |
| 398 | 398 |
template <typename Digraph> |
| 399 | 399 |
DigraphReader<Digraph> digraphReader(Digraph& digraph, const char *fn); |
| 400 | 400 |
|
| 401 | 401 |
/// \ingroup lemon_io |
| 402 | 402 |
/// |
| 403 | 403 |
/// \brief \ref lgf-format "LGF" reader for directed graphs |
| 404 | 404 |
/// |
| 405 | 405 |
/// This utility reads an \ref lgf-format "LGF" file. |
| 406 | 406 |
/// |
| 407 | 407 |
/// The reading method does a batch processing. The user creates a |
| 408 | 408 |
/// reader object, then various reading rules can be added to the |
| 409 | 409 |
/// reader, and eventually the reading is executed with the \c run() |
| 410 | 410 |
/// member function. A map reading rule can be added to the reader |
| 411 | 411 |
/// with the \c nodeMap() or \c arcMap() members. An optional |
| 412 | 412 |
/// converter parameter can also be added as a standard functor |
| 413 | 413 |
/// converting from \c std::string to the value type of the map. If it |
| 414 | 414 |
/// is set, it will determine how the tokens in the file should be |
| 415 | 415 |
/// converted to the value type of the map. If the functor is not set, |
| 416 | 416 |
/// then a default conversion will be used. One map can be read into |
| 417 | 417 |
/// multiple map objects at the same time. The \c attribute(), \c |
| 418 | 418 |
/// node() and \c arc() functions are used to add attribute reading |
| ... | ... |
@@ -542,49 +542,49 @@ |
| 542 | 542 |
delete it->second; |
| 543 | 543 |
} |
| 544 | 544 |
|
| 545 | 545 |
for (typename ArcMaps::iterator it = _arc_maps.begin(); |
| 546 | 546 |
it != _arc_maps.end(); ++it) {
|
| 547 | 547 |
delete it->second; |
| 548 | 548 |
} |
| 549 | 549 |
|
| 550 | 550 |
for (typename Attributes::iterator it = _attributes.begin(); |
| 551 | 551 |
it != _attributes.end(); ++it) {
|
| 552 | 552 |
delete it->second; |
| 553 | 553 |
} |
| 554 | 554 |
|
| 555 | 555 |
if (local_is) {
|
| 556 | 556 |
delete _is; |
| 557 | 557 |
} |
| 558 | 558 |
|
| 559 | 559 |
} |
| 560 | 560 |
|
| 561 | 561 |
private: |
| 562 | 562 |
|
| 563 | 563 |
template <typename DGR> |
| 564 | 564 |
friend DigraphReader<DGR> digraphReader(DGR& digraph, std::istream& is); |
| 565 | 565 |
template <typename DGR> |
| 566 |
friend DigraphReader<DGR> digraphReader(DGR& digraph, |
|
| 566 |
friend DigraphReader<DGR> digraphReader(DGR& digraph, |
|
| 567 | 567 |
const std::string& fn); |
| 568 | 568 |
template <typename DGR> |
| 569 | 569 |
friend DigraphReader<DGR> digraphReader(DGR& digraph, const char *fn); |
| 570 | 570 |
|
| 571 | 571 |
DigraphReader(DigraphReader& other) |
| 572 | 572 |
: _is(other._is), local_is(other.local_is), _digraph(other._digraph), |
| 573 | 573 |
_use_nodes(other._use_nodes), _use_arcs(other._use_arcs), |
| 574 | 574 |
_skip_nodes(other._skip_nodes), _skip_arcs(other._skip_arcs) {
|
| 575 | 575 |
|
| 576 | 576 |
other._is = 0; |
| 577 | 577 |
other.local_is = false; |
| 578 | 578 |
|
| 579 | 579 |
_node_index.swap(other._node_index); |
| 580 | 580 |
_arc_index.swap(other._arc_index); |
| 581 | 581 |
|
| 582 | 582 |
_node_maps.swap(other._node_maps); |
| 583 | 583 |
_arc_maps.swap(other._arc_maps); |
| 584 | 584 |
_attributes.swap(other._attributes); |
| 585 | 585 |
|
| 586 | 586 |
_nodes_caption = other._nodes_caption; |
| 587 | 587 |
_arcs_caption = other._arcs_caption; |
| 588 | 588 |
_attributes_caption = other._attributes_caption; |
| 589 | 589 |
|
| 590 | 590 |
} |
| ... | ... |
@@ -1208,51 +1208,51 @@ |
| 1208 | 1208 |
|
| 1209 | 1209 |
/// \brief Return a \ref DigraphReader class |
| 1210 | 1210 |
/// |
| 1211 | 1211 |
/// This function just returns a \ref DigraphReader class. |
| 1212 | 1212 |
/// \relates DigraphReader |
| 1213 | 1213 |
template <typename Digraph> |
| 1214 | 1214 |
DigraphReader<Digraph> digraphReader(Digraph& digraph, |
| 1215 | 1215 |
const std::string& fn) {
|
| 1216 | 1216 |
DigraphReader<Digraph> tmp(digraph, fn); |
| 1217 | 1217 |
return tmp; |
| 1218 | 1218 |
} |
| 1219 | 1219 |
|
| 1220 | 1220 |
/// \brief Return a \ref DigraphReader class |
| 1221 | 1221 |
/// |
| 1222 | 1222 |
/// This function just returns a \ref DigraphReader class. |
| 1223 | 1223 |
/// \relates DigraphReader |
| 1224 | 1224 |
template <typename Digraph> |
| 1225 | 1225 |
DigraphReader<Digraph> digraphReader(Digraph& digraph, const char* fn) {
|
| 1226 | 1226 |
DigraphReader<Digraph> tmp(digraph, fn); |
| 1227 | 1227 |
return tmp; |
| 1228 | 1228 |
} |
| 1229 | 1229 |
|
| 1230 | 1230 |
template <typename Graph> |
| 1231 | 1231 |
class GraphReader; |
| 1232 |
|
|
| 1232 |
|
|
| 1233 | 1233 |
template <typename Graph> |
| 1234 |
GraphReader<Graph> graphReader(Graph& graph, |
|
| 1234 |
GraphReader<Graph> graphReader(Graph& graph, |
|
| 1235 | 1235 |
std::istream& is = std::cin); |
| 1236 | 1236 |
template <typename Graph> |
| 1237 | 1237 |
GraphReader<Graph> graphReader(Graph& graph, const std::string& fn); |
| 1238 | 1238 |
template <typename Graph> |
| 1239 | 1239 |
GraphReader<Graph> graphReader(Graph& graph, const char *fn); |
| 1240 | 1240 |
|
| 1241 | 1241 |
/// \ingroup lemon_io |
| 1242 | 1242 |
/// |
| 1243 | 1243 |
/// \brief \ref lgf-format "LGF" reader for undirected graphs |
| 1244 | 1244 |
/// |
| 1245 | 1245 |
/// This utility reads an \ref lgf-format "LGF" file. |
| 1246 | 1246 |
/// |
| 1247 | 1247 |
/// It can be used almost the same way as \c DigraphReader. |
| 1248 | 1248 |
/// The only difference is that this class can handle edges and |
| 1249 | 1249 |
/// edge maps as well as arcs and arc maps. |
| 1250 | 1250 |
/// |
| 1251 | 1251 |
/// The columns in the \c \@edges (or \c \@arcs) section are the |
| 1252 | 1252 |
/// edge maps. However, if there are two maps with the same name |
| 1253 | 1253 |
/// prefixed with \c '+' and \c '-', then these can be read into an |
| 1254 | 1254 |
/// arc map. Similarly, an attribute can be read into an arc, if |
| 1255 | 1255 |
/// it's value is an edge label prefixed with \c '+' or \c '-'. |
| 1256 | 1256 |
template <typename _Graph> |
| 1257 | 1257 |
class GraphReader {
|
| 1258 | 1258 |
public: |
| ... | ... |
@@ -1345,49 +1345,49 @@ |
| 1345 | 1345 |
it != _node_maps.end(); ++it) {
|
| 1346 | 1346 |
delete it->second; |
| 1347 | 1347 |
} |
| 1348 | 1348 |
|
| 1349 | 1349 |
for (typename EdgeMaps::iterator it = _edge_maps.begin(); |
| 1350 | 1350 |
it != _edge_maps.end(); ++it) {
|
| 1351 | 1351 |
delete it->second; |
| 1352 | 1352 |
} |
| 1353 | 1353 |
|
| 1354 | 1354 |
for (typename Attributes::iterator it = _attributes.begin(); |
| 1355 | 1355 |
it != _attributes.end(); ++it) {
|
| 1356 | 1356 |
delete it->second; |
| 1357 | 1357 |
} |
| 1358 | 1358 |
|
| 1359 | 1359 |
if (local_is) {
|
| 1360 | 1360 |
delete _is; |
| 1361 | 1361 |
} |
| 1362 | 1362 |
|
| 1363 | 1363 |
} |
| 1364 | 1364 |
|
| 1365 | 1365 |
private: |
| 1366 | 1366 |
template <typename GR> |
| 1367 | 1367 |
friend GraphReader<GR> graphReader(GR& graph, std::istream& is); |
| 1368 | 1368 |
template <typename GR> |
| 1369 |
friend GraphReader<GR> graphReader(GR& graph, const std::string& fn); |
|
| 1369 |
friend GraphReader<GR> graphReader(GR& graph, const std::string& fn); |
|
| 1370 | 1370 |
template <typename GR> |
| 1371 | 1371 |
friend GraphReader<GR> graphReader(GR& graph, const char *fn); |
| 1372 | 1372 |
|
| 1373 | 1373 |
GraphReader(GraphReader& other) |
| 1374 | 1374 |
: _is(other._is), local_is(other.local_is), _graph(other._graph), |
| 1375 | 1375 |
_use_nodes(other._use_nodes), _use_edges(other._use_edges), |
| 1376 | 1376 |
_skip_nodes(other._skip_nodes), _skip_edges(other._skip_edges) {
|
| 1377 | 1377 |
|
| 1378 | 1378 |
other._is = 0; |
| 1379 | 1379 |
other.local_is = false; |
| 1380 | 1380 |
|
| 1381 | 1381 |
_node_index.swap(other._node_index); |
| 1382 | 1382 |
_edge_index.swap(other._edge_index); |
| 1383 | 1383 |
|
| 1384 | 1384 |
_node_maps.swap(other._node_maps); |
| 1385 | 1385 |
_edge_maps.swap(other._edge_maps); |
| 1386 | 1386 |
_attributes.swap(other._attributes); |
| 1387 | 1387 |
|
| 1388 | 1388 |
_nodes_caption = other._nodes_caption; |
| 1389 | 1389 |
_edges_caption = other._edges_caption; |
| 1390 | 1390 |
_attributes_caption = other._attributes_caption; |
| 1391 | 1391 |
|
| 1392 | 1392 |
} |
| 1393 | 1393 |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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 lemon_io |
| 20 | 20 |
///\file |
| 21 | 21 |
///\brief \ref lgf-format "LEMON Graph Format" writer. |
| 22 | 22 |
|
| 23 | 23 |
|
| 24 | 24 |
#ifndef LEMON_LGF_WRITER_H |
| 25 | 25 |
#define LEMON_LGF_WRITER_H |
| 26 | 26 |
|
| 27 | 27 |
#include <iostream> |
| 28 | 28 |
#include <fstream> |
| 29 | 29 |
#include <sstream> |
| ... | ... |
@@ -485,49 +485,49 @@ |
| 485 | 485 |
~DigraphWriter() {
|
| 486 | 486 |
for (typename NodeMaps::iterator it = _node_maps.begin(); |
| 487 | 487 |
it != _node_maps.end(); ++it) {
|
| 488 | 488 |
delete it->second; |
| 489 | 489 |
} |
| 490 | 490 |
|
| 491 | 491 |
for (typename ArcMaps::iterator it = _arc_maps.begin(); |
| 492 | 492 |
it != _arc_maps.end(); ++it) {
|
| 493 | 493 |
delete it->second; |
| 494 | 494 |
} |
| 495 | 495 |
|
| 496 | 496 |
for (typename Attributes::iterator it = _attributes.begin(); |
| 497 | 497 |
it != _attributes.end(); ++it) {
|
| 498 | 498 |
delete it->second; |
| 499 | 499 |
} |
| 500 | 500 |
|
| 501 | 501 |
if (local_os) {
|
| 502 | 502 |
delete _os; |
| 503 | 503 |
} |
| 504 | 504 |
} |
| 505 | 505 |
|
| 506 | 506 |
private: |
| 507 | 507 |
|
| 508 | 508 |
template <typename DGR> |
| 509 |
friend DigraphWriter<DGR> digraphWriter(const DGR& digraph, |
|
| 509 |
friend DigraphWriter<DGR> digraphWriter(const DGR& digraph, |
|
| 510 | 510 |
std::ostream& os); |
| 511 | 511 |
template <typename DGR> |
| 512 | 512 |
friend DigraphWriter<DGR> digraphWriter(const DGR& digraph, |
| 513 | 513 |
const std::string& fn); |
| 514 | 514 |
template <typename DGR> |
| 515 | 515 |
friend DigraphWriter<DGR> digraphWriter(const DGR& digraph, |
| 516 | 516 |
const char *fn); |
| 517 | 517 |
|
| 518 | 518 |
DigraphWriter(DigraphWriter& other) |
| 519 | 519 |
: _os(other._os), local_os(other.local_os), _digraph(other._digraph), |
| 520 | 520 |
_skip_nodes(other._skip_nodes), _skip_arcs(other._skip_arcs) {
|
| 521 | 521 |
|
| 522 | 522 |
other._os = 0; |
| 523 | 523 |
other.local_os = false; |
| 524 | 524 |
|
| 525 | 525 |
_node_index.swap(other._node_index); |
| 526 | 526 |
_arc_index.swap(other._arc_index); |
| 527 | 527 |
|
| 528 | 528 |
_node_maps.swap(other._node_maps); |
| 529 | 529 |
_arc_maps.swap(other._arc_maps); |
| 530 | 530 |
_attributes.swap(other._attributes); |
| 531 | 531 |
|
| 532 | 532 |
_nodes_caption = other._nodes_caption; |
| 533 | 533 |
_arcs_caption = other._arcs_caption; |
| ... | ... |
@@ -1061,49 +1061,49 @@ |
| 1061 | 1061 |
delete it->second; |
| 1062 | 1062 |
} |
| 1063 | 1063 |
|
| 1064 | 1064 |
for (typename Attributes::iterator it = _attributes.begin(); |
| 1065 | 1065 |
it != _attributes.end(); ++it) {
|
| 1066 | 1066 |
delete it->second; |
| 1067 | 1067 |
} |
| 1068 | 1068 |
|
| 1069 | 1069 |
if (local_os) {
|
| 1070 | 1070 |
delete _os; |
| 1071 | 1071 |
} |
| 1072 | 1072 |
} |
| 1073 | 1073 |
|
| 1074 | 1074 |
private: |
| 1075 | 1075 |
|
| 1076 | 1076 |
template <typename GR> |
| 1077 | 1077 |
friend GraphWriter<GR> graphWriter(const GR& graph, |
| 1078 | 1078 |
std::ostream& os); |
| 1079 | 1079 |
template <typename GR> |
| 1080 | 1080 |
friend GraphWriter<GR> graphWriter(const GR& graph, |
| 1081 | 1081 |
const std::string& fn); |
| 1082 | 1082 |
template <typename GR> |
| 1083 | 1083 |
friend GraphWriter<GR> graphWriter(const GR& graph, |
| 1084 | 1084 |
const char *fn); |
| 1085 |
|
|
| 1085 |
|
|
| 1086 | 1086 |
GraphWriter(GraphWriter& other) |
| 1087 | 1087 |
: _os(other._os), local_os(other.local_os), _graph(other._graph), |
| 1088 | 1088 |
_skip_nodes(other._skip_nodes), _skip_edges(other._skip_edges) {
|
| 1089 | 1089 |
|
| 1090 | 1090 |
other._os = 0; |
| 1091 | 1091 |
other.local_os = false; |
| 1092 | 1092 |
|
| 1093 | 1093 |
_node_index.swap(other._node_index); |
| 1094 | 1094 |
_edge_index.swap(other._edge_index); |
| 1095 | 1095 |
|
| 1096 | 1096 |
_node_maps.swap(other._node_maps); |
| 1097 | 1097 |
_edge_maps.swap(other._edge_maps); |
| 1098 | 1098 |
_attributes.swap(other._attributes); |
| 1099 | 1099 |
|
| 1100 | 1100 |
_nodes_caption = other._nodes_caption; |
| 1101 | 1101 |
_edges_caption = other._edges_caption; |
| 1102 | 1102 |
_attributes_caption = other._attributes_caption; |
| 1103 | 1103 |
} |
| 1104 | 1104 |
|
| 1105 | 1105 |
GraphWriter& operator=(const GraphWriter&); |
| 1106 | 1106 |
|
| 1107 | 1107 |
public: |
| 1108 | 1108 |
|
| 1109 | 1109 |
/// \name Writing rules |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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_LIST_GRAPH_H |
| 20 | 20 |
#define LEMON_LIST_GRAPH_H |
| 21 | 21 |
|
| 22 | 22 |
///\ingroup graphs |
| 23 | 23 |
///\file |
| 24 | 24 |
///\brief ListDigraph, ListGraph classes. |
| 25 | 25 |
|
| 26 | 26 |
#include <lemon/core.h> |
| 27 | 27 |
#include <lemon/error.h> |
| 28 | 28 |
#include <lemon/bits/graph_extender.h> |
| 29 | 29 |
|
| ... | ... |
@@ -819,50 +819,50 @@ |
| 819 | 819 |
|
| 820 | 820 |
class Edge {
|
| 821 | 821 |
friend class ListGraphBase; |
| 822 | 822 |
protected: |
| 823 | 823 |
|
| 824 | 824 |
int id; |
| 825 | 825 |
explicit Edge(int pid) { id = pid;}
|
| 826 | 826 |
|
| 827 | 827 |
public: |
| 828 | 828 |
Edge() {}
|
| 829 | 829 |
Edge (Invalid) { id = -1; }
|
| 830 | 830 |
bool operator==(const Edge& edge) const {return id == edge.id;}
|
| 831 | 831 |
bool operator!=(const Edge& edge) const {return id != edge.id;}
|
| 832 | 832 |
bool operator<(const Edge& edge) const {return id < edge.id;}
|
| 833 | 833 |
}; |
| 834 | 834 |
|
| 835 | 835 |
class Arc {
|
| 836 | 836 |
friend class ListGraphBase; |
| 837 | 837 |
protected: |
| 838 | 838 |
|
| 839 | 839 |
int id; |
| 840 | 840 |
explicit Arc(int pid) { id = pid;}
|
| 841 | 841 |
|
| 842 | 842 |
public: |
| 843 |
operator Edge() const {
|
|
| 844 |
return id != -1 ? edgeFromId(id / 2) : INVALID; |
|
| 843 |
operator Edge() const {
|
|
| 844 |
return id != -1 ? edgeFromId(id / 2) : INVALID; |
|
| 845 | 845 |
} |
| 846 | 846 |
|
| 847 | 847 |
Arc() {}
|
| 848 | 848 |
Arc (Invalid) { id = -1; }
|
| 849 | 849 |
bool operator==(const Arc& arc) const {return id == arc.id;}
|
| 850 | 850 |
bool operator!=(const Arc& arc) const {return id != arc.id;}
|
| 851 | 851 |
bool operator<(const Arc& arc) const {return id < arc.id;}
|
| 852 | 852 |
}; |
| 853 | 853 |
|
| 854 | 854 |
|
| 855 | 855 |
|
| 856 | 856 |
ListGraphBase() |
| 857 | 857 |
: nodes(), first_node(-1), |
| 858 | 858 |
first_free_node(-1), arcs(), first_free_arc(-1) {}
|
| 859 | 859 |
|
| 860 | 860 |
|
| 861 | 861 |
int maxNodeId() const { return nodes.size()-1; }
|
| 862 | 862 |
int maxEdgeId() const { return arcs.size() / 2 - 1; }
|
| 863 | 863 |
int maxArcId() const { return arcs.size()-1; }
|
| 864 | 864 |
|
| 865 | 865 |
Node source(Arc e) const { return Node(arcs[e.id ^ 1].target); }
|
| 866 | 866 |
Node target(Arc e) const { return Node(arcs[e.id].target); }
|
| 867 | 867 |
|
| 868 | 868 |
Node u(Edge e) const { return Node(arcs[2 * e.id].target); }
|
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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 paths |
| 20 | 20 |
///\file |
| 21 | 21 |
///\brief Classes for representing paths in digraphs. |
| 22 | 22 |
/// |
| 23 | 23 |
|
| 24 | 24 |
#ifndef LEMON_PATH_H |
| 25 | 25 |
#define LEMON_PATH_H |
| 26 | 26 |
|
| 27 | 27 |
#include <vector> |
| 28 | 28 |
#include <algorithm> |
| 29 | 29 |
|
| ... | ... |
@@ -945,62 +945,62 @@ |
| 945 | 945 |
to.clear(); |
| 946 | 946 |
to.build(from); |
| 947 | 947 |
} |
| 948 | 948 |
}; |
| 949 | 949 |
|
| 950 | 950 |
template <typename From, typename To, |
| 951 | 951 |
bool buildEnable = BuildTagIndicator<To>::value> |
| 952 | 952 |
struct PathCopySelectorBackward {
|
| 953 | 953 |
static void copy(const From& from, To& to) {
|
| 954 | 954 |
to.clear(); |
| 955 | 955 |
for (typename From::RevArcIt it(from); it != INVALID; ++it) {
|
| 956 | 956 |
to.addFront(it); |
| 957 | 957 |
} |
| 958 | 958 |
} |
| 959 | 959 |
}; |
| 960 | 960 |
|
| 961 | 961 |
template <typename From, typename To> |
| 962 | 962 |
struct PathCopySelectorBackward<From, To, true> {
|
| 963 | 963 |
static void copy(const From& from, To& to) {
|
| 964 | 964 |
to.clear(); |
| 965 | 965 |
to.buildRev(from); |
| 966 | 966 |
} |
| 967 | 967 |
}; |
| 968 | 968 |
|
| 969 |
|
|
| 969 |
|
|
| 970 | 970 |
template <typename From, typename To, |
| 971 | 971 |
bool revEnable = RevPathTagIndicator<From>::value> |
| 972 | 972 |
struct PathCopySelector {
|
| 973 | 973 |
static void copy(const From& from, To& to) {
|
| 974 | 974 |
PathCopySelectorForward<From, To>::copy(from, to); |
| 975 |
} |
|
| 975 |
} |
|
| 976 | 976 |
}; |
| 977 | 977 |
|
| 978 | 978 |
template <typename From, typename To> |
| 979 | 979 |
struct PathCopySelector<From, To, true> {
|
| 980 | 980 |
static void copy(const From& from, To& to) {
|
| 981 | 981 |
PathCopySelectorBackward<From, To>::copy(from, to); |
| 982 |
} |
|
| 982 |
} |
|
| 983 | 983 |
}; |
| 984 | 984 |
|
| 985 | 985 |
} |
| 986 | 986 |
|
| 987 | 987 |
|
| 988 | 988 |
/// \brief Make a copy of a path. |
| 989 | 989 |
/// |
| 990 | 990 |
/// This function makes a copy of a path. |
| 991 | 991 |
template <typename From, typename To> |
| 992 | 992 |
void pathCopy(const From& from, To& to) {
|
| 993 | 993 |
checkConcept<concepts::PathDumper<typename From::Digraph>, From>(); |
| 994 | 994 |
_path_bits::PathCopySelector<From, To>::copy(from, to); |
| 995 | 995 |
} |
| 996 | 996 |
|
| 997 | 997 |
/// \brief Deprecated version of \ref pathCopy(). |
| 998 | 998 |
/// |
| 999 | 999 |
/// Deprecated version of \ref pathCopy() (only for reverse compatibility). |
| 1000 | 1000 |
template <typename To, typename From> |
| 1001 | 1001 |
void copyPath(To& to, const From& from) {
|
| 1002 | 1002 |
pathCopy(from, to); |
| 1003 | 1003 |
} |
| 1004 | 1004 |
|
| 1005 | 1005 |
/// \brief Check the consistency of a path. |
| 1006 | 1006 |
/// |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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 |
/* |
| 20 | 20 |
* This file contains the reimplemented version of the Mersenne Twister |
| 21 | 21 |
* Generator of Matsumoto and Nishimura. |
| 22 | 22 |
* |
| 23 | 23 |
* See the appropriate copyright notice below. |
| 24 | 24 |
* |
| 25 | 25 |
* Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, |
| 26 | 26 |
* All rights reserved. |
| 27 | 27 |
* |
| 28 | 28 |
* Redistribution and use in source and binary forms, with or without |
| 29 | 29 |
* modification, are permitted provided that the following conditions |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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_SMART_GRAPH_H |
| 20 | 20 |
#define LEMON_SMART_GRAPH_H |
| 21 | 21 |
|
| 22 | 22 |
///\ingroup graphs |
| 23 | 23 |
///\file |
| 24 | 24 |
///\brief SmartDigraph and SmartGraph classes. |
| 25 | 25 |
|
| 26 | 26 |
#include <vector> |
| 27 | 27 |
|
| 28 | 28 |
#include <lemon/core.h> |
| 29 | 29 |
#include <lemon/error.h> |
| ... | ... |
@@ -445,50 +445,50 @@ |
| 445 | 445 |
|
| 446 | 446 |
class Edge {
|
| 447 | 447 |
friend class SmartGraphBase; |
| 448 | 448 |
protected: |
| 449 | 449 |
|
| 450 | 450 |
int _id; |
| 451 | 451 |
explicit Edge(int id) { _id = id;}
|
| 452 | 452 |
|
| 453 | 453 |
public: |
| 454 | 454 |
Edge() {}
|
| 455 | 455 |
Edge (Invalid) { _id = -1; }
|
| 456 | 456 |
bool operator==(const Edge& arc) const {return _id == arc._id;}
|
| 457 | 457 |
bool operator!=(const Edge& arc) const {return _id != arc._id;}
|
| 458 | 458 |
bool operator<(const Edge& arc) const {return _id < arc._id;}
|
| 459 | 459 |
}; |
| 460 | 460 |
|
| 461 | 461 |
class Arc {
|
| 462 | 462 |
friend class SmartGraphBase; |
| 463 | 463 |
protected: |
| 464 | 464 |
|
| 465 | 465 |
int _id; |
| 466 | 466 |
explicit Arc(int id) { _id = id;}
|
| 467 | 467 |
|
| 468 | 468 |
public: |
| 469 |
operator Edge() const {
|
|
| 470 |
return _id != -1 ? edgeFromId(_id / 2) : INVALID; |
|
| 469 |
operator Edge() const {
|
|
| 470 |
return _id != -1 ? edgeFromId(_id / 2) : INVALID; |
|
| 471 | 471 |
} |
| 472 | 472 |
|
| 473 | 473 |
Arc() {}
|
| 474 | 474 |
Arc (Invalid) { _id = -1; }
|
| 475 | 475 |
bool operator==(const Arc& arc) const {return _id == arc._id;}
|
| 476 | 476 |
bool operator!=(const Arc& arc) const {return _id != arc._id;}
|
| 477 | 477 |
bool operator<(const Arc& arc) const {return _id < arc._id;}
|
| 478 | 478 |
}; |
| 479 | 479 |
|
| 480 | 480 |
|
| 481 | 481 |
|
| 482 | 482 |
SmartGraphBase() |
| 483 | 483 |
: nodes(), arcs() {}
|
| 484 | 484 |
|
| 485 | 485 |
|
| 486 | 486 |
int maxNodeId() const { return nodes.size()-1; }
|
| 487 | 487 |
int maxEdgeId() const { return arcs.size() / 2 - 1; }
|
| 488 | 488 |
int maxArcId() const { return arcs.size()-1; }
|
| 489 | 489 |
|
| 490 | 490 |
Node source(Arc e) const { return Node(arcs[e._id ^ 1].target); }
|
| 491 | 491 |
Node target(Arc e) const { return Node(arcs[e._id].target); }
|
| 492 | 492 |
|
| 493 | 493 |
Node u(Edge e) const { return Node(arcs[2 * e._id].target); }
|
| 494 | 494 |
Node v(Edge e) const { return Node(arcs[2 * e._id + 1].target); }
|
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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 | 27 |
#include <lemon/bits/windows.h> |
| 28 | 28 |
#else |
| 29 | 29 |
#include <unistd.h> |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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_TOLERANCE_H |
| 20 | 20 |
#define LEMON_TOLERANCE_H |
| 21 | 21 |
|
| 22 | 22 |
///\ingroup misc |
| 23 | 23 |
///\file |
| 24 | 24 |
///\brief A basic tool to handle the anomalies of calculation with |
| 25 | 25 |
///floating point numbers. |
| 26 | 26 |
/// |
| 27 | 27 |
|
| 28 | 28 |
namespace lemon {
|
| 29 | 29 |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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_UNION_FIND_H |
| 20 | 20 |
#define LEMON_UNION_FIND_H |
| 21 | 21 |
|
| 22 | 22 |
//!\ingroup auxdat |
| 23 | 23 |
//!\file |
| 24 | 24 |
//!\brief Union-Find data structures. |
| 25 | 25 |
//! |
| 26 | 26 |
|
| 27 | 27 |
#include <vector> |
| 28 | 28 |
#include <list> |
| 29 | 29 |
#include <utility> |
| ... | ... |
@@ -1168,49 +1168,49 @@ |
| 1168 | 1168 |
int kd = nodes[jd].left; |
| 1169 | 1169 |
if (nodes[jd].size == 1) {
|
| 1170 | 1170 |
if (nodes[jd].parent < 0) {
|
| 1171 | 1171 |
classes[id].parent = ~kd; |
| 1172 | 1172 |
classes[id].depth -= 1; |
| 1173 | 1173 |
nodes[kd].parent = ~id; |
| 1174 | 1174 |
deleteNode(jd); |
| 1175 | 1175 |
jd = kd; |
| 1176 | 1176 |
} else {
|
| 1177 | 1177 |
int pd = nodes[jd].parent; |
| 1178 | 1178 |
if (nodes[nodes[jd].next].size < cmax) {
|
| 1179 | 1179 |
pushLeft(nodes[jd].next, nodes[jd].left); |
| 1180 | 1180 |
if (less(jd, nodes[jd].next) || |
| 1181 | 1181 |
nodes[jd].item == nodes[pd].item) {
|
| 1182 | 1182 |
nodes[nodes[jd].next].prio = nodes[jd].prio; |
| 1183 | 1183 |
nodes[nodes[jd].next].item = nodes[jd].item; |
| 1184 | 1184 |
} |
| 1185 | 1185 |
popLeft(pd); |
| 1186 | 1186 |
deleteNode(jd); |
| 1187 | 1187 |
jd = pd; |
| 1188 | 1188 |
} else {
|
| 1189 | 1189 |
int ld = nodes[nodes[jd].next].left; |
| 1190 | 1190 |
popLeft(nodes[jd].next); |
| 1191 | 1191 |
pushRight(jd, ld); |
| 1192 |
if (less(ld, nodes[jd].left) || |
|
| 1192 |
if (less(ld, nodes[jd].left) || |
|
| 1193 | 1193 |
nodes[ld].item == nodes[pd].item) {
|
| 1194 | 1194 |
nodes[jd].item = nodes[ld].item; |
| 1195 | 1195 |
nodes[jd].prio = nodes[ld].prio; |
| 1196 | 1196 |
} |
| 1197 | 1197 |
if (nodes[nodes[jd].next].item == nodes[ld].item) {
|
| 1198 | 1198 |
setPrio(nodes[jd].next); |
| 1199 | 1199 |
} |
| 1200 | 1200 |
jd = nodes[jd].left; |
| 1201 | 1201 |
} |
| 1202 | 1202 |
} |
| 1203 | 1203 |
} else {
|
| 1204 | 1204 |
jd = nodes[jd].left; |
| 1205 | 1205 |
} |
| 1206 | 1206 |
} |
| 1207 | 1207 |
} |
| 1208 | 1208 |
|
| 1209 | 1209 |
void repairRight(int id) {
|
| 1210 | 1210 |
int jd = ~(classes[id].parent); |
| 1211 | 1211 |
while (nodes[jd].right != -1) {
|
| 1212 | 1212 |
int kd = nodes[jd].right; |
| 1213 | 1213 |
if (nodes[jd].size == 1) {
|
| 1214 | 1214 |
if (nodes[jd].parent < 0) {
|
| 1215 | 1215 |
classes[id].parent = ~kd; |
| 1216 | 1216 |
classes[id].depth -= 1; |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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 |
#include <lemon/concepts/digraph.h> |
| 20 | 20 |
#include <lemon/smart_graph.h> |
| 21 | 21 |
#include <lemon/list_graph.h> |
| 22 | 22 |
#include <lemon/lgf_reader.h> |
| 23 | 23 |
#include <lemon/dfs.h> |
| 24 | 24 |
#include <lemon/path.h> |
| 25 | 25 |
|
| 26 | 26 |
#include "graph_test.h" |
| 27 | 27 |
#include "test_tools.h" |
| 28 | 28 |
|
| 29 | 29 |
using namespace lemon; |
| ... | ... |
@@ -163,37 +163,37 @@ |
| 163 | 163 |
Path<Digraph> p = dfs_test.path(t); |
| 164 | 164 |
check(p.length() == dfs_test.dist(t),"path() found a wrong path."); |
| 165 | 165 |
check(checkPath(G, p),"path() found a wrong path."); |
| 166 | 166 |
check(pathSource(G, p) == s,"path() found a wrong path."); |
| 167 | 167 |
check(pathTarget(G, p) == t,"path() found a wrong path."); |
| 168 | 168 |
|
| 169 | 169 |
for(NodeIt v(G); v!=INVALID; ++v) {
|
| 170 | 170 |
if (dfs_test.reached(v)) {
|
| 171 | 171 |
check(v==s || dfs_test.predArc(v)!=INVALID, "Wrong tree."); |
| 172 | 172 |
if (dfs_test.predArc(v)!=INVALID ) {
|
| 173 | 173 |
Arc e=dfs_test.predArc(v); |
| 174 | 174 |
Node u=G.source(e); |
| 175 | 175 |
check(u==dfs_test.predNode(v),"Wrong tree."); |
| 176 | 176 |
check(dfs_test.dist(v) - dfs_test.dist(u) == 1, |
| 177 | 177 |
"Wrong distance. (" << dfs_test.dist(u) << "->"
|
| 178 | 178 |
<< dfs_test.dist(v) << ")"); |
| 179 | 179 |
} |
| 180 | 180 |
} |
| 181 | 181 |
} |
| 182 | 182 |
|
| 183 | 183 |
{
|
| 184 | 184 |
Dfs<Digraph> dfs(G); |
| 185 | 185 |
check(dfs.run(s1,t1) && dfs.reached(t1),"Node 3 is reachable from Node 6."); |
| 186 | 186 |
} |
| 187 |
|
|
| 187 |
|
|
| 188 | 188 |
{
|
| 189 | 189 |
NullMap<Node,Arc> myPredMap; |
| 190 | 190 |
dfs(G).predMap(myPredMap).run(s); |
| 191 | 191 |
} |
| 192 | 192 |
} |
| 193 | 193 |
|
| 194 | 194 |
int main() |
| 195 | 195 |
{
|
| 196 | 196 |
checkDfs<ListDigraph>(); |
| 197 | 197 |
checkDfs<SmartDigraph>(); |
| 198 | 198 |
return 0; |
| 199 | 199 |
} |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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 |
#include <lemon/smart_graph.h> |
| 20 | 20 |
#include <lemon/list_graph.h> |
| 21 | 21 |
#include <lemon/lgf_reader.h> |
| 22 | 22 |
#include <lemon/error.h> |
| 23 | 23 |
|
| 24 | 24 |
#include "test_tools.h" |
| 25 | 25 |
|
| 26 | 26 |
using namespace std; |
| 27 | 27 |
using namespace lemon; |
| 28 | 28 |
|
| 29 | 29 |
void digraph_copy_test() {
|
| ... | ... |
@@ -49,77 +49,77 @@ |
| 49 | 49 |
SmartDigraph::Arc arc = from.addArc(fnv[i], fnv[j]); |
| 50 | 50 |
fam[arc] = i + j * j; |
| 51 | 51 |
if (i == 0 && j == 0) fa = arc; |
| 52 | 52 |
} |
| 53 | 53 |
} |
| 54 | 54 |
|
| 55 | 55 |
// Test digraph copy |
| 56 | 56 |
ListDigraph to; |
| 57 | 57 |
ListDigraph::NodeMap<int> tnm(to); |
| 58 | 58 |
ListDigraph::ArcMap<int> tam(to); |
| 59 | 59 |
ListDigraph::Node tn; |
| 60 | 60 |
ListDigraph::Arc ta; |
| 61 | 61 |
|
| 62 | 62 |
SmartDigraph::NodeMap<ListDigraph::Node> nr(from); |
| 63 | 63 |
SmartDigraph::ArcMap<ListDigraph::Arc> er(from); |
| 64 | 64 |
|
| 65 | 65 |
ListDigraph::NodeMap<SmartDigraph::Node> ncr(to); |
| 66 | 66 |
ListDigraph::ArcMap<SmartDigraph::Arc> ecr(to); |
| 67 | 67 |
|
| 68 | 68 |
digraphCopy(from, to). |
| 69 | 69 |
nodeMap(fnm, tnm).arcMap(fam, tam). |
| 70 | 70 |
nodeRef(nr).arcRef(er). |
| 71 | 71 |
nodeCrossRef(ncr).arcCrossRef(ecr). |
| 72 | 72 |
node(fn, tn).arc(fa, ta).run(); |
| 73 |
|
|
| 73 |
|
|
| 74 | 74 |
check(countNodes(from) == countNodes(to), "Wrong copy."); |
| 75 | 75 |
check(countArcs(from) == countArcs(to), "Wrong copy."); |
| 76 | 76 |
|
| 77 | 77 |
for (SmartDigraph::NodeIt it(from); it != INVALID; ++it) {
|
| 78 | 78 |
check(ncr[nr[it]] == it, "Wrong copy."); |
| 79 | 79 |
check(fnm[it] == tnm[nr[it]], "Wrong copy."); |
| 80 | 80 |
} |
| 81 | 81 |
|
| 82 | 82 |
for (SmartDigraph::ArcIt it(from); it != INVALID; ++it) {
|
| 83 | 83 |
check(ecr[er[it]] == it, "Wrong copy."); |
| 84 | 84 |
check(fam[it] == tam[er[it]], "Wrong copy."); |
| 85 | 85 |
check(nr[from.source(it)] == to.source(er[it]), "Wrong copy."); |
| 86 | 86 |
check(nr[from.target(it)] == to.target(er[it]), "Wrong copy."); |
| 87 | 87 |
} |
| 88 | 88 |
|
| 89 | 89 |
for (ListDigraph::NodeIt it(to); it != INVALID; ++it) {
|
| 90 | 90 |
check(nr[ncr[it]] == it, "Wrong copy."); |
| 91 | 91 |
} |
| 92 | 92 |
|
| 93 | 93 |
for (ListDigraph::ArcIt it(to); it != INVALID; ++it) {
|
| 94 | 94 |
check(er[ecr[it]] == it, "Wrong copy."); |
| 95 | 95 |
} |
| 96 | 96 |
check(tn == nr[fn], "Wrong copy."); |
| 97 | 97 |
check(ta == er[fa], "Wrong copy."); |
| 98 | 98 |
|
| 99 | 99 |
// Test repeated copy |
| 100 | 100 |
digraphCopy(from, to).run(); |
| 101 |
|
|
| 101 |
|
|
| 102 | 102 |
check(countNodes(from) == countNodes(to), "Wrong copy."); |
| 103 | 103 |
check(countArcs(from) == countArcs(to), "Wrong copy."); |
| 104 | 104 |
} |
| 105 | 105 |
|
| 106 | 106 |
void graph_copy_test() {
|
| 107 | 107 |
const int nn = 10; |
| 108 | 108 |
|
| 109 | 109 |
// Build a graph |
| 110 | 110 |
SmartGraph from; |
| 111 | 111 |
SmartGraph::NodeMap<int> fnm(from); |
| 112 | 112 |
SmartGraph::ArcMap<int> fam(from); |
| 113 | 113 |
SmartGraph::EdgeMap<int> fem(from); |
| 114 | 114 |
SmartGraph::Node fn = INVALID; |
| 115 | 115 |
SmartGraph::Arc fa = INVALID; |
| 116 | 116 |
SmartGraph::Edge fe = INVALID; |
| 117 | 117 |
|
| 118 | 118 |
std::vector<SmartGraph::Node> fnv; |
| 119 | 119 |
for (int i = 0; i < nn; ++i) {
|
| 120 | 120 |
SmartGraph::Node node = from.addNode(); |
| 121 | 121 |
fnv.push_back(node); |
| 122 | 122 |
fnm[node] = i * i; |
| 123 | 123 |
if (i == 0) fn = node; |
| 124 | 124 |
} |
| 125 | 125 |
|
| ... | ... |
@@ -179,37 +179,37 @@ |
| 179 | 179 |
check(nr[from.u(it)] == to.u(er[it]) || nr[from.u(it)] == to.v(er[it]), |
| 180 | 180 |
"Wrong copy."); |
| 181 | 181 |
check(nr[from.v(it)] == to.u(er[it]) || nr[from.v(it)] == to.v(er[it]), |
| 182 | 182 |
"Wrong copy."); |
| 183 | 183 |
check((from.u(it) != from.v(it)) == (to.u(er[it]) != to.v(er[it])), |
| 184 | 184 |
"Wrong copy."); |
| 185 | 185 |
} |
| 186 | 186 |
|
| 187 | 187 |
for (ListGraph::NodeIt it(to); it != INVALID; ++it) {
|
| 188 | 188 |
check(nr[ncr[it]] == it, "Wrong copy."); |
| 189 | 189 |
} |
| 190 | 190 |
|
| 191 | 191 |
for (ListGraph::ArcIt it(to); it != INVALID; ++it) {
|
| 192 | 192 |
check(ar[acr[it]] == it, "Wrong copy."); |
| 193 | 193 |
} |
| 194 | 194 |
for (ListGraph::EdgeIt it(to); it != INVALID; ++it) {
|
| 195 | 195 |
check(er[ecr[it]] == it, "Wrong copy."); |
| 196 | 196 |
} |
| 197 | 197 |
check(tn == nr[fn], "Wrong copy."); |
| 198 | 198 |
check(ta == ar[fa], "Wrong copy."); |
| 199 | 199 |
check(te == er[fe], "Wrong copy."); |
| 200 | 200 |
|
| 201 | 201 |
// Test repeated copy |
| 202 | 202 |
graphCopy(from, to).run(); |
| 203 |
|
|
| 203 |
|
|
| 204 | 204 |
check(countNodes(from) == countNodes(to), "Wrong copy."); |
| 205 | 205 |
check(countEdges(from) == countEdges(to), "Wrong copy."); |
| 206 | 206 |
check(countArcs(from) == countArcs(to), "Wrong copy."); |
| 207 | 207 |
} |
| 208 | 208 |
|
| 209 | 209 |
|
| 210 | 210 |
int main() {
|
| 211 | 211 |
digraph_copy_test(); |
| 212 | 212 |
graph_copy_test(); |
| 213 | 213 |
|
| 214 | 214 |
return 0; |
| 215 | 215 |
} |
| ... | ... |
@@ -42,125 +42,125 @@ |
| 42 | 42 |
"1\n" |
| 43 | 43 |
"@arcs\n" |
| 44 | 44 |
" -\n" |
| 45 | 45 |
"0 1\n"; |
| 46 | 46 |
|
| 47 | 47 |
char test_lgf_bad1[] = |
| 48 | 48 |
"@nodes\n" |
| 49 | 49 |
"label\n" |
| 50 | 50 |
"0\n" |
| 51 | 51 |
"1\n" |
| 52 | 52 |
"@arcs\n" |
| 53 | 53 |
" - another\n" |
| 54 | 54 |
"0 1\n"; |
| 55 | 55 |
|
| 56 | 56 |
char test_lgf_bad2[] = |
| 57 | 57 |
"@nodes\n" |
| 58 | 58 |
"label\n" |
| 59 | 59 |
"0\n" |
| 60 | 60 |
"1\n" |
| 61 | 61 |
"@arcs\n" |
| 62 | 62 |
" label -\n" |
| 63 | 63 |
"0 1\n"; |
| 64 | 64 |
|
| 65 | 65 |
|
| 66 |
int main() |
|
| 66 |
int main() |
|
| 67 | 67 |
{
|
| 68 | 68 |
{
|
| 69 |
ListDigraph d; |
|
| 69 |
ListDigraph d; |
|
| 70 | 70 |
ListDigraph::Node s,t; |
| 71 | 71 |
ListDigraph::ArcMap<int> label(d); |
| 72 | 72 |
std::istringstream input(test_lgf); |
| 73 | 73 |
digraphReader(d, input). |
| 74 | 74 |
node("source", s).
|
| 75 | 75 |
node("target", t).
|
| 76 | 76 |
arcMap("label", label).
|
| 77 | 77 |
run(); |
| 78 | 78 |
check(countNodes(d) == 2,"There should be 2 nodes"); |
| 79 | 79 |
check(countArcs(d) == 2,"There should be 2 arcs"); |
| 80 | 80 |
} |
| 81 | 81 |
{
|
| 82 | 82 |
ListGraph g; |
| 83 | 83 |
ListGraph::Node s,t; |
| 84 | 84 |
ListGraph::EdgeMap<int> label(g); |
| 85 | 85 |
std::istringstream input(test_lgf); |
| 86 | 86 |
graphReader(g, input). |
| 87 | 87 |
node("source", s).
|
| 88 | 88 |
node("target", t).
|
| 89 | 89 |
edgeMap("label", label).
|
| 90 | 90 |
run(); |
| 91 | 91 |
check(countNodes(g) == 2,"There should be 2 nodes"); |
| 92 | 92 |
check(countEdges(g) == 2,"There should be 2 arcs"); |
| 93 | 93 |
} |
| 94 | 94 |
|
| 95 | 95 |
{
|
| 96 |
ListDigraph d; |
|
| 96 |
ListDigraph d; |
|
| 97 | 97 |
std::istringstream input(test_lgf_nomap); |
| 98 | 98 |
digraphReader(d, input). |
| 99 | 99 |
run(); |
| 100 | 100 |
check(countNodes(d) == 2,"There should be 2 nodes"); |
| 101 | 101 |
check(countArcs(d) == 1,"There should be 1 arc"); |
| 102 | 102 |
} |
| 103 | 103 |
{
|
| 104 | 104 |
ListGraph g; |
| 105 | 105 |
std::istringstream input(test_lgf_nomap); |
| 106 | 106 |
graphReader(g, input). |
| 107 | 107 |
run(); |
| 108 | 108 |
check(countNodes(g) == 2,"There should be 2 nodes"); |
| 109 | 109 |
check(countEdges(g) == 1,"There should be 1 edge"); |
| 110 | 110 |
} |
| 111 | 111 |
|
| 112 | 112 |
{
|
| 113 |
ListDigraph d; |
|
| 113 |
ListDigraph d; |
|
| 114 | 114 |
std::istringstream input(test_lgf_bad1); |
| 115 | 115 |
bool ok=false; |
| 116 | 116 |
try {
|
| 117 | 117 |
digraphReader(d, input). |
| 118 | 118 |
run(); |
| 119 | 119 |
} |
| 120 |
catch (FormatError& error) |
|
| 120 |
catch (FormatError& error) |
|
| 121 | 121 |
{
|
| 122 | 122 |
ok = true; |
| 123 | 123 |
} |
| 124 | 124 |
check(ok,"FormatError exception should have occured"); |
| 125 | 125 |
} |
| 126 | 126 |
{
|
| 127 | 127 |
ListGraph g; |
| 128 | 128 |
std::istringstream input(test_lgf_bad1); |
| 129 | 129 |
bool ok=false; |
| 130 | 130 |
try {
|
| 131 | 131 |
graphReader(g, input). |
| 132 | 132 |
run(); |
| 133 | 133 |
} |
| 134 | 134 |
catch (FormatError& error) |
| 135 | 135 |
{
|
| 136 | 136 |
ok = true; |
| 137 | 137 |
} |
| 138 | 138 |
check(ok,"FormatError exception should have occured"); |
| 139 | 139 |
} |
| 140 | 140 |
|
| 141 | 141 |
{
|
| 142 |
ListDigraph d; |
|
| 142 |
ListDigraph d; |
|
| 143 | 143 |
std::istringstream input(test_lgf_bad2); |
| 144 | 144 |
bool ok=false; |
| 145 | 145 |
try {
|
| 146 | 146 |
digraphReader(d, input). |
| 147 | 147 |
run(); |
| 148 | 148 |
} |
| 149 | 149 |
catch (FormatError& error) |
| 150 | 150 |
{
|
| 151 | 151 |
ok = true; |
| 152 | 152 |
} |
| 153 | 153 |
check(ok,"FormatError exception should have occured"); |
| 154 | 154 |
} |
| 155 | 155 |
{
|
| 156 | 156 |
ListGraph g; |
| 157 | 157 |
std::istringstream input(test_lgf_bad2); |
| 158 | 158 |
bool ok=false; |
| 159 | 159 |
try {
|
| 160 | 160 |
graphReader(g, input). |
| 161 | 161 |
run(); |
| 162 | 162 |
} |
| 163 | 163 |
catch (FormatError& error) |
| 164 | 164 |
{
|
| 165 | 165 |
ok = true; |
| 166 | 166 |
} |
| 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 |
* Copyright (C) 2003- |
|
| 5 |
* Copyright (C) 2003-2011 |
|
| 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 |
#include <deque> |
| 20 | 20 |
#include <set> |
| 21 | 21 |
|
| 22 | 22 |
#include <lemon/concept_check.h> |
| 23 | 23 |
#include <lemon/concepts/maps.h> |
| 24 | 24 |
#include <lemon/maps.h> |
| 25 | 25 |
|
| 26 | 26 |
#include "test_tools.h" |
| 27 | 27 |
|
| 28 | 28 |
using namespace lemon; |
| 29 | 29 |
using namespace lemon::concepts; |
| ... | ... |
@@ -48,50 +48,52 @@ |
| 48 | 48 |
F& operator=(const F&); |
| 49 | 49 |
}; |
| 50 | 50 |
|
| 51 | 51 |
int func(A) { return 3; }
|
| 52 | 52 |
|
| 53 | 53 |
int binc(int a, B) { return a+1; }
|
| 54 | 54 |
|
| 55 | 55 |
typedef ReadMap<A, double> DoubleMap; |
| 56 | 56 |
typedef ReadWriteMap<A, double> DoubleWriteMap; |
| 57 | 57 |
typedef ReferenceMap<A, double, double&, const double&> DoubleRefMap; |
| 58 | 58 |
|
| 59 | 59 |
typedef ReadMap<A, bool> BoolMap; |
| 60 | 60 |
typedef ReadWriteMap<A, bool> BoolWriteMap; |
| 61 | 61 |
typedef ReferenceMap<A, bool, bool&, const bool&> BoolRefMap; |
| 62 | 62 |
|
| 63 | 63 |
int main() |
| 64 | 64 |
{
|
| 65 | 65 |
// Map concepts |
| 66 | 66 |
checkConcept<ReadMap<A,B>, ReadMap<A,B> >(); |
| 67 | 67 |
checkConcept<ReadMap<A,C>, ReadMap<A,C> >(); |
| 68 | 68 |
checkConcept<WriteMap<A,B>, WriteMap<A,B> >(); |
| 69 | 69 |
checkConcept<WriteMap<A,C>, WriteMap<A,C> >(); |
| 70 | 70 |
checkConcept<ReadWriteMap<A,B>, ReadWriteMap<A,B> >(); |
| 71 | 71 |
checkConcept<ReadWriteMap<A,C>, ReadWriteMap<A,C> >(); |
| 72 |
checkConcept<ReferenceMap<A,B,B&,const B&>, ReferenceMap<A,B,B&,const B&> >(); |
|
| 73 |
checkConcept<ReferenceMap<A,C,C&,const C&>, ReferenceMap<A,C,C&,const C&> >(); |
|
| 72 |
checkConcept<ReferenceMap<A,B,B&,const B&>, |
|
| 73 |
ReferenceMap<A,B,B&,const B&> >(); |
|
| 74 |
checkConcept<ReferenceMap<A,C,C&,const C&>, |
|
| 75 |
ReferenceMap<A,C,C&,const C&> >(); |
|
| 74 | 76 |
|
| 75 | 77 |
// NullMap |
| 76 | 78 |
{
|
| 77 | 79 |
checkConcept<ReadWriteMap<A,B>, NullMap<A,B> >(); |
| 78 | 80 |
NullMap<A,B> map1; |
| 79 | 81 |
NullMap<A,B> map2 = map1; |
| 80 | 82 |
map1 = nullMap<A,B>(); |
| 81 | 83 |
} |
| 82 | 84 |
|
| 83 | 85 |
// ConstMap |
| 84 | 86 |
{
|
| 85 | 87 |
checkConcept<ReadWriteMap<A,B>, ConstMap<A,B> >(); |
| 86 | 88 |
checkConcept<ReadWriteMap<A,C>, ConstMap<A,C> >(); |
| 87 | 89 |
ConstMap<A,B> map1; |
| 88 | 90 |
ConstMap<A,B> map2 = B(); |
| 89 | 91 |
ConstMap<A,B> map3 = map1; |
| 90 | 92 |
map1 = constMap<A>(B()); |
| 91 | 93 |
map1 = constMap<A,B>(); |
| 92 | 94 |
map1.setAll(B()); |
| 93 | 95 |
ConstMap<A,C> map4(C(1)); |
| 94 | 96 |
ConstMap<A,C> map5 = map4; |
| 95 | 97 |
map4 = constMap<A>(C(2)); |
| 96 | 98 |
map4.setAll(C(3)); |
| 97 | 99 |
|
| ... | ... |
@@ -178,49 +180,50 @@ |
| 178 | 180 |
check(!composeMap(m1,m2)[0] && composeMap(m1,m2)[1], |
| 179 | 181 |
"Something is wrong with ComposeMap") |
| 180 | 182 |
} |
| 181 | 183 |
|
| 182 | 184 |
// CombineMap |
| 183 | 185 |
{
|
| 184 | 186 |
typedef CombineMap<DoubleMap, DoubleMap, std::plus<double> > CombMap; |
| 185 | 187 |
checkConcept<ReadMap<A,double>, CombMap>(); |
| 186 | 188 |
CombMap map1 = CombMap(DoubleMap(), DoubleMap()); |
| 187 | 189 |
CombMap map2 = combineMap(DoubleMap(), DoubleMap(), std::plus<double>()); |
| 188 | 190 |
|
| 189 | 191 |
check(combineMap(constMap<B,int,2>(), identityMap<B>(), &binc)[B()] == 3, |
| 190 | 192 |
"Something is wrong with CombineMap"); |
| 191 | 193 |
} |
| 192 | 194 |
|
| 193 | 195 |
// FunctorToMap, MapToFunctor |
| 194 | 196 |
{
|
| 195 | 197 |
checkConcept<ReadMap<A,B>, FunctorToMap<F,A,B> >(); |
| 196 | 198 |
checkConcept<ReadMap<A,B>, FunctorToMap<F> >(); |
| 197 | 199 |
FunctorToMap<F> map1; |
| 198 | 200 |
FunctorToMap<F> map2 = FunctorToMap<F>(F()); |
| 199 | 201 |
B b = functorToMap(F())[A()]; |
| 200 | 202 |
|
| 201 | 203 |
checkConcept<ReadMap<A,B>, MapToFunctor<ReadMap<A,B> > >(); |
| 202 |
MapToFunctor<ReadMap<A,B> > map = |
|
| 204 |
MapToFunctor<ReadMap<A,B> > map = |
|
| 205 |
MapToFunctor<ReadMap<A,B> >(ReadMap<A,B>()); |
|
| 203 | 206 |
|
| 204 | 207 |
check(functorToMap(&func)[A()] == 3, |
| 205 | 208 |
"Something is wrong with FunctorToMap"); |
| 206 | 209 |
check(mapToFunctor(constMap<A,int>(2))(A()) == 2, |
| 207 | 210 |
"Something is wrong with MapToFunctor"); |
| 208 | 211 |
check(mapToFunctor(functorToMap(&func))(A()) == 3 && |
| 209 | 212 |
mapToFunctor(functorToMap(&func))[A()] == 3, |
| 210 | 213 |
"Something is wrong with FunctorToMap or MapToFunctor"); |
| 211 | 214 |
check(functorToMap(mapToFunctor(constMap<A,int>(2)))[A()] == 2, |
| 212 | 215 |
"Something is wrong with FunctorToMap or MapToFunctor"); |
| 213 | 216 |
} |
| 214 | 217 |
|
| 215 | 218 |
// ConvertMap |
| 216 | 219 |
{
|
| 217 | 220 |
checkConcept<ReadMap<double,double>, |
| 218 | 221 |
ConvertMap<ReadMap<double, int>, double> >(); |
| 219 | 222 |
ConvertMap<RangeMap<bool>, int> map1(rangeMap(1, true)); |
| 220 | 223 |
ConvertMap<RangeMap<bool>, int> map2 = convertMap<int>(rangeMap(2, false)); |
| 221 | 224 |
} |
| 222 | 225 |
|
| 223 | 226 |
// ForkMap |
| 224 | 227 |
{
|
| 225 | 228 |
checkConcept<DoubleWriteMap, ForkMap<DoubleWriteMap, DoubleWriteMap> >(); |
| 226 | 229 |
|
0 comments (0 inline)