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 ↑
Ignore white space 6 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
Ignore white space 6 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
}
Ignore white space 6 line context
... ...
@@ -36,6 +36,7 @@
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/.*
Ignore white space 6 line context
... ...
@@ -27,6 +27,7 @@
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 \
Ignore white space 6 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)