gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Port DIMACS tools from svn -r3516 Namely, - apply migrate script - apply unify sources - break long lines - Fixes the compilation - dim_to_lgf -> dimacs-to-lgf - better .hgignore - shorten the doc of dimacs-to-lgf
0 3 2
default
5 files changed with 423 insertions and 1 deletions:
↑ Collapse diff ↑
Show white space 3221225472 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2008
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_DIMACS_H
20
#define LEMON_DIMACS_H
21

	
22
#include <iostream>
23
#include <string>
24
#include <vector>
25
#include <lemon/maps.h>
26

	
27
/// \ingroup dimacs_group
28
/// \file
29
/// \brief DIMACS file format reader.
30

	
31
namespace lemon {
32

	
33
  ///@defgroup dimacs_group DIMACS format
34
  ///\brief Read and write files in DIMACS format
35
  ///
36
  ///Tools to read a digraph from or write it to a file in DIMACS format
37
  ///data
38
  ///\ingroup io_group
39

	
40
  /// \addtogroup dimacs_group
41
  /// @{
42

	
43
  /// DIMACS min cost flow reader function.
44
  ///
45
  /// This function reads a min cost flow instance from DIMACS format,
46
  /// i.e. from DIMACS files having a line starting with
47
  /// \code
48
  ///   p min
49
  /// \endcode
50
  /// At the beginning \c g is cleared by \c g.clear(). The supply
51
  /// amount of the nodes are written to \c supply (signed). The
52
  /// lower bounds, capacities and costs of the arcs are written to
53
  /// \c lower, \c capacity and \c cost.
54
  template <typename Digraph, typename LowerMap,
55
    typename CapacityMap, typename CostMap,
56
    typename SupplyMap>
57
  void readDimacs( std::istream& is,
58
                   Digraph &g,
59
                   LowerMap& lower,
60
                   CapacityMap& capacity,
61
                   CostMap& cost,
62
                   SupplyMap& supply )
63
  {
64
    g.clear();
65
    std::vector<typename Digraph::Node> nodes;
66
    typename Digraph::Arc e;
67
    std::string problem, str;
68
    char c;
69
    int n, m;
70
    int i, j;
71
    typename SupplyMap::Value sup;
72
    typename CapacityMap::Value low;
73
    typename CapacityMap::Value cap;
74
    typename CostMap::Value co;
75
    while (is >> c) {
76
      switch (c) {
77
      case 'c': // comment line
78
        getline(is, str);
79
        break;
80
      case 'p': // problem definition line
81
        is >> problem >> n >> m;
82
        getline(is, str);
83
        if (problem != "min") return;
84
        nodes.resize(n + 1);
85
        for (int k = 1; k <= n; ++k) {
86
          nodes[k] = g.addNode();
87
          supply.set(nodes[k], 0);
88
        }
89
        break;
90
      case 'n': // node definition line
91
        is >> i >> sup;
92
        getline(is, str);
93
        supply.set(nodes[i], sup);
94
        break;
95
      case 'a': // arc (arc) definition line
96
        is >> i >> j >> low >> cap >> co;
97
        getline(is, str);
98
        e = g.addArc(nodes[i], nodes[j]);
99
        lower.set(e, low);
100
        if (cap >= 0)
101
          capacity.set(e, cap);
102
        else
103
          capacity.set(e, -1);
104
        cost.set(e, co);
105
        break;
106
      }
107
    }
108
  }
109

	
110
  /// DIMACS max flow reader function.
111
  ///
112
  /// This function reads a max flow instance from DIMACS format,
113
  /// i.e. from DIMACS files having a line starting with
114
  /// \code
115
  ///   p max
116
  /// \endcode
117
  /// At the beginning \c g is cleared by \c g.clear(). The arc
118
  /// capacities are written to \c capacity and \c s and \c t are
119
  /// set to the source and the target nodes.
120
  template<typename Digraph, typename CapacityMap>
121
  void readDimacs(std::istream& is, Digraph &g, CapacityMap& capacity,
122
                  typename Digraph::Node &s, typename Digraph::Node &t) {
123
    g.clear();
124
    std::vector<typename Digraph::Node> nodes;
125
    typename Digraph::Arc e;
126
    std::string problem;
127
    char c, d;
128
    int n, m;
129
    int i, j;
130
    typename CapacityMap::Value _cap;
131
    std::string str;
132
    while (is >> c) {
133
      switch (c) {
134
      case 'c': // comment line
135
        getline(is, str);
136
        break;
137
      case 'p': // problem definition line
138
        is >> problem >> n >> m;
139
        getline(is, str);
140
        nodes.resize(n + 1);
141
        for (int k = 1; k <= n; ++k)
142
          nodes[k] = g.addNode();
143
        break;
144
      case 'n': // node definition line
145
        if (problem == "sp") { // shortest path problem
146
          is >> i;
147
          getline(is, str);
148
          s = nodes[i];
149
        }
150
        if (problem == "max") { // max flow problem
151
          is >> i >> d;
152
          getline(is, str);
153
          if (d == 's') s = nodes[i];
154
          if (d == 't') t = nodes[i];
155
        }
156
        break;
157
      case 'a': // arc (arc) definition line
158
        if (problem == "max" || problem == "sp") {
159
          is >> i >> j >> _cap;
160
          getline(is, str);
161
          e = g.addArc(nodes[i], nodes[j]);
162
          capacity.set(e, _cap);
163
        } else {
164
          is >> i >> j;
165
          getline(is, str);
166
          g.addArc(nodes[i], nodes[j]);
167
        }
168
        break;
169
      }
170
    }
171
  }
172

	
173
  /// DIMACS shortest path reader function.
174
  ///
175
  /// This function reads a shortest path instance from DIMACS format,
176
  /// i.e. from DIMACS files having a line starting with
177
  /// \code
178
  ///   p sp
179
  /// \endcode
180
  /// At the beginning \c g is cleared by \c g.clear(). The arc
181
  /// capacities are written to \c capacity and \c s is set to the
182
  /// source node.
183
  template<typename Digraph, typename CapacityMap>
184
  void readDimacs(std::istream& is, Digraph &g, CapacityMap& capacity,
185
                  typename Digraph::Node &s) {
186
    readDimacs(is, g, capacity, s, s);
187
  }
188

	
189
  /// DIMACS capacitated digraph reader function.
190
  ///
191
  /// This function reads an arc capacitated digraph instance from
192
  /// DIMACS format. At the beginning \c g is cleared by \c g.clear()
193
  /// and the arc capacities are written to \c capacity.
194
  template<typename Digraph, typename CapacityMap>
195
  void readDimacs(std::istream& is, Digraph &g, CapacityMap& capacity) {
196
    typename Digraph::Node u;
197
    readDimacs(is, g, capacity, u, u);
198
  }
199

	
200
  /// DIMACS plain digraph reader function.
201
  ///
202
  /// This function reads a digraph without any designated nodes and
203
  /// maps from DIMACS format, i.e. from DIMACS files having a line
204
  /// starting with
205
  /// \code
206
  ///   p mat
207
  /// \endcode
208
  /// At the beginning \c g is cleared by \c g.clear().
209
  template<typename Digraph>
210
  void readDimacs(std::istream& is, Digraph &g) {
211
    typename Digraph::Node u;
212
    NullMap<typename Digraph::Arc, int> n;
213
    readDimacs(is, g, n, u, u);
214
  }
215

	
216
  /// DIMACS plain digraph writer function.
217
  ///
218
  /// This function writes a digraph without any designated nodes and
219
  /// maps into DIMACS format, i.e. into DIMACS file having a line
220
  /// starting with
221
  /// \code
222
  ///   p mat
223
  /// \endcode
224
  template<typename Digraph>
225
  void writeDimacs(std::ostream& os, const Digraph &g) {
226
    typedef typename Digraph::NodeIt NodeIt;
227
    typedef typename Digraph::ArcIt ArcIt;
228

	
229
    os << "c matching problem" << std::endl;
230
    os << "p mat " << g.nodeNum() << " " << g.arcNum() << std::endl;
231

	
232
    typename Digraph::template NodeMap<int> nodes(g);
233
    int i = 1;
234
    for(NodeIt v(g); v != INVALID; ++v) {
235
      nodes.set(v, i);
236
      ++i;
237
    }
238
    for(ArcIt e(g); e != INVALID; ++e) {
239
      os << "a " << nodes[g.source(e)] << " " << nodes[g.target(e)]
240
         << std::endl;
241
    }
242
  }
243

	
244
  /// @}
245

	
246
} //namespace lemon
247

	
248
#endif //LEMON_DIMACS_H
Show white space 3221225472 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2008
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
///\ingroup tools
20
///\file
21
///\brief DIMACS to LGF converter.
22
///
23
/// This program converts various DIMACS formats to the LEMON Digraph Format
24
/// (LGF).
25
///
26
/// See
27
/// \verbatim
28
///  dimacs-to-lgf --help
29
/// \endverbatim
30
/// for more info on usage.
31
///
32

	
33
#include <iostream>
34
#include <fstream>
35
#include <cstring>
36

	
37
#include <lemon/smart_graph.h>
38
#include <lemon/dimacs.h>
39
#include <lemon/lgf_writer.h>
40

	
41
#include <lemon/arg_parser.h>
42

	
43
using namespace std;
44
using namespace lemon;
45

	
46

	
47
int main(int argc, const char *argv[]) {
48
  typedef SmartDigraph Digraph;
49

	
50
  typedef Digraph::Arc Arc;
51
  typedef Digraph::Node Node;
52
  typedef Digraph::ArcIt ArcIt;
53
  typedef Digraph::NodeIt NodeIt;
54
  typedef Digraph::ArcMap<double> DoubleArcMap;
55
  typedef Digraph::NodeMap<double> DoubleNodeMap;
56

	
57
  std::string inputName;
58
  std::string outputName;
59
  std::string typeName;
60

	
61
  bool mincostflow;
62
  bool maxflow;
63
  bool shortestpath;
64
  bool capacitated;
65
  bool plain;
66

	
67
  bool version;
68

	
69
  ArgParser ap(argc, argv);
70
  ap.refOption("-input",
71
               "use FILE as input instead of standard input",
72
               inputName).synonym("i", "-input")
73
    .refOption("-output",
74
               "use FILE as output instead of standard output",
75
               outputName).synonym("o", "-output")
76
    .refOption("-mincostflow",
77
               "set the type of the digraph to \"mincostflow\" digraph",
78
               mincostflow)
79
    .optionGroup("type", "-mincostflow").synonym("mcf", "-mincostflow")
80
    .refOption("-maxflow",
81
               "set the type of the digraph to \"maxflow\" digraph",
82
               maxflow)
83
    .optionGroup("type", "-maxflow").synonym("mf", "-maxflow")
84
    .refOption("-shortestpath",
85
               "set the type of the digraph to \"shortestpath\" digraph",
86
               shortestpath)
87
    .optionGroup("type", "-shortestpath").synonym("sp", "-shortestpath")
88
    .refOption("-capacitated",
89
               "set the type of the digraph to \"capacitated\" digraph",
90
               capacitated)
91
    .optionGroup("type", "-capacitated").synonym("cap", "-capacitated")
92
    .refOption("-plain",
93
               "set the type of the digraph to \"plain\" digraph",
94
               plain)
95
    .optionGroup("type", "-plain").synonym("pl", "-plain")
96
    .onlyOneGroup("type")
97
    .mandatoryGroup("type")
98
    .refOption("-version", "show version information", version)
99
    .synonym("v", "-version")
100
    .run();
101

	
102
  ifstream input;
103
  if (!inputName.empty()) {
104
    input.open(inputName.c_str());
105
    if (!input) {
106
      cerr << "File open error" << endl;
107
      return -1;
108
    }
109
  }
110
  istream& is = (inputName.empty() ? cin : input);
111

	
112
  ofstream output;
113
  if (!outputName.empty()) {
114
    output.open(outputName.c_str());
115
    if (!output) {
116
      cerr << "File open error" << endl;
117
      return -1;
118
    }
119
  }
120
  ostream& os = (outputName.empty() ? cout : output);
121

	
122
  if (mincostflow) {
123
    Digraph digraph;
124
    DoubleArcMap lower(digraph), capacity(digraph), cost(digraph);
125
    DoubleNodeMap supply(digraph);
126
    readDimacs(is, digraph, lower, capacity, cost, supply);
127
    DigraphWriter<Digraph>(digraph, os).
128
      nodeMap("supply", supply).
129
      arcMap("lower", lower).
130
      arcMap("capacity", capacity).
131
      arcMap("cost", cost).
132
      run();
133
  } else if (maxflow) {
134
    Digraph digraph;
135
    Node s, t;
136
    DoubleArcMap capacity(digraph);
137
    readDimacs(is, digraph, capacity, s, t);
138
    DigraphWriter<Digraph>(digraph, os).
139
      arcMap("capacity", capacity).
140
      node("source", s).
141
      node("target", t).
142
      run();
143
  } else if (shortestpath) {
144
    Digraph digraph;
145
    Node s;
146
    DoubleArcMap capacity(digraph);
147
    readDimacs(is, digraph, capacity, s);
148
    DigraphWriter<Digraph>(digraph, os).
149
      arcMap("capacity", capacity).
150
      node("source", s).
151
      run();
152
  } else if (capacitated) {
153
    Digraph digraph;
154
    DoubleArcMap capacity(digraph);
155
    readDimacs(is, digraph, capacity);
156
    DigraphWriter<Digraph>(digraph, os).
157
      arcMap("capacity", capacity).
158
      run();
159
  } else if (plain) {
160
    Digraph digraph;
161
    readDimacs(is, digraph);
162
    DigraphWriter<Digraph>(digraph, os).run();
163
  } else {
164
    cerr << "Invalid type error" << endl;
165
    return -1;
166
  }
167
  return 0;
168
}
Show white space 3221225472 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
*.bak
11 11
Makefile.in
12 12
aclocal.m4
13 13
config.h.in
14 14
configure
15 15
Makefile
16 16
config.h
17 17
config.log
18 18
config.status
19 19
libtool
20 20
stamp-h1
21 21
lemon/lemon.pc
22 22
lemon/libemon.la
23 23
lemon/stamp-h2
24 24
doc/Doxyfile
25 25
.dirstamp
26 26
.libs/*
27 27
.deps/*
28 28
demo/*.eps
29 29

	
30 30
syntax: regexp
31 31
(.*/)?\#[^/]*\#$
32 32
(.*/)?\.\#[^/]*$
33 33
^doc/html/.*
34 34
^doc/.*\.tag
35 35
^autom4te.cache/.*
36 36
^build-aux/.*
37 37
^objs.*/.*
38 38
^test/[a-z_]*$
39
^tools/[a-z-_]*$
39 40
^demo/.*_demo$
40 41
^build/.*
41 42
^doc/gen-images/.*
42 43
CMakeFiles
43 44
DartTestfile.txt
44 45
cmake_install.cmake
45 46
CMakeCache.txt
Show white space 3221225472 line context
1 1
EXTRA_DIST += \
2 2
	lemon/lemon.pc.in \
3 3
	lemon/CMakeLists.txt
4 4

	
5 5
pkgconfig_DATA += lemon/lemon.pc
6 6

	
7 7
lib_LTLIBRARIES += lemon/libemon.la
8 8

	
9 9
lemon_libemon_la_SOURCES = \
10 10
        lemon/arg_parser.cc \
11 11
        lemon/base.cc \
12 12
        lemon/color.cc \
13 13
        lemon/random.cc
14 14

	
15 15
#lemon_libemon_la_CXXFLAGS = $(GLPK_CFLAGS) $(CPLEX_CFLAGS) $(SOPLEX_CXXFLAGS) $(AM_CXXFLAGS)
16 16
#lemon_libemon_la_LDFLAGS = $(GLPK_LIBS) $(CPLEX_LIBS) $(SOPLEX_LIBS)
17 17

	
18 18
lemon_HEADERS += \
19 19
        lemon/arg_parser.h \
20 20
	lemon/assert.h \
21 21
        lemon/bfs.h \
22 22
        lemon/bin_heap.h \
23 23
        lemon/color.h \
24 24
	lemon/concept_check.h \
25 25
        lemon/counter.h \
26 26
	lemon/core.h \
27 27
        lemon/dfs.h \
28 28
        lemon/dijkstra.h \
29 29
        lemon/dim2.h \
30
        lemon/dimacs.h \
30 31
	lemon/elevator.h \
31 32
	lemon/error.h \
32 33
	lemon/full_graph.h \
33 34
        lemon/graph_to_eps.h \
34 35
        lemon/grid_graph.h \
35 36
	lemon/hypercube_graph.h \
36 37
	lemon/kruskal.h \
37 38
	lemon/lgf_reader.h \
38 39
	lemon/lgf_writer.h \
39 40
	lemon/list_graph.h \
40 41
	lemon/maps.h \
41 42
	lemon/math.h \
42 43
	lemon/max_matching.h \
43 44
	lemon/nauty_reader.h \
44 45
	lemon/path.h \
45 46
        lemon/random.h \
46 47
	lemon/smart_graph.h \
47 48
	lemon/suurballe.h \
48 49
        lemon/time_measure.h \
49 50
        lemon/tolerance.h \
50 51
	lemon/unionfind.h
51 52

	
52 53
bits_HEADERS += \
53 54
	lemon/bits/alteration_notifier.h \
54 55
	lemon/bits/array_map.h \
55 56
	lemon/bits/base_extender.h \
56 57
        lemon/bits/bezier.h \
57 58
	lemon/bits/default_map.h \
58 59
        lemon/bits/enable_if.h \
59 60
	lemon/bits/graph_extender.h \
60 61
	lemon/bits/map_extender.h \
61 62
	lemon/bits/path_dump.h \
62 63
	lemon/bits/traits.h \
63 64
	lemon/bits/vector_map.h
64 65

	
65 66
concept_HEADERS += \
66 67
	lemon/concepts/digraph.h \
67 68
	lemon/concepts/graph.h \
68 69
	lemon/concepts/graph_components.h \
69 70
	lemon/concepts/heap.h \
70 71
	lemon/concepts/maps.h \
71 72
	lemon/concepts/path.h
Show white space 3221225472 line context
1 1
if WANT_TOOLS
2 2

	
3
bin_PROGRAMS +=
3
bin_PROGRAMS += \
4
	tools/dimacs-to-lgf
5

	
4 6
dist_bin_SCRIPTS += tools/lemon-0.x-to-1.x.sh
5 7

	
6 8
endif WANT_TOOLS
9

	
10
tools_dimacs_to_lgf_SOURCES = tools/dimacs-to-lgf.cc
0 comments (0 inline)