COIN-OR::LEMON - Graph Library

source: lemon-1.2/tools/dimacs-to-lgf.cc @ 385:50d96f2166d7

Last change on this file since 385:50d96f2166d7 was 385:50d96f2166d7, checked in by Alpar Juttner <alpar@…>, 16 years ago

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
File size: 4.7 KB
Line 
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
43using namespace std;
44using namespace lemon;
45
46
47int 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}
Note: See TracBrowser for help on using the repository browser.