summaryrefslogtreecommitdiff
path: root/lemon/tools/dimacs-to-lgf.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lemon/tools/dimacs-to-lgf.cc')
-rw-r--r--lemon/tools/dimacs-to-lgf.cc148
1 files changed, 148 insertions, 0 deletions
diff --git a/lemon/tools/dimacs-to-lgf.cc b/lemon/tools/dimacs-to-lgf.cc
new file mode 100644
index 0000000..3968645
--- /dev/null
+++ b/lemon/tools/dimacs-to-lgf.cc
@@ -0,0 +1,148 @@
+/* -*- mode: C++; indent-tabs-mode: nil; -*-
+ *
+ * This file is a part of LEMON, a generic C++ optimization library.
+ *
+ * Copyright (C) 2003-2009
+ * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
+ * (Egervary Research Group on Combinatorial Optimization, EGRES).
+ *
+ * Permission to use, modify and distribute this software is granted
+ * provided that this copyright notice appears in all copies. For
+ * precise terms see the accompanying LICENSE file.
+ *
+ * This software is provided "AS IS" with no warranty of any kind,
+ * express or implied, and with no claim as to its suitability for any
+ * purpose.
+ *
+ */
+
+///\ingroup tools
+///\file
+///\brief DIMACS to LGF converter.
+///
+/// This program converts various DIMACS formats to the LEMON Digraph Format
+/// (LGF).
+///
+/// See
+/// \code
+/// dimacs-to-lgf --help
+/// \endcode
+/// for more info on the usage.
+
+#include <iostream>
+#include <fstream>
+#include <cstring>
+
+#include <lemon/smart_graph.h>
+#include <lemon/dimacs.h>
+#include <lemon/lgf_writer.h>
+
+#include <lemon/arg_parser.h>
+#include <lemon/error.h>
+
+using namespace std;
+using namespace lemon;
+
+
+int main(int argc, const char *argv[]) {
+ typedef SmartDigraph Digraph;
+
+ typedef Digraph::Arc Arc;
+ typedef Digraph::Node Node;
+ typedef Digraph::ArcIt ArcIt;
+ typedef Digraph::NodeIt NodeIt;
+ typedef Digraph::ArcMap<double> DoubleArcMap;
+ typedef Digraph::NodeMap<double> DoubleNodeMap;
+
+ std::string inputName;
+ std::string outputName;
+
+ ArgParser ap(argc, argv);
+ ap.other("[INFILE [OUTFILE]]",
+ "If either the INFILE or OUTFILE file is missing the standard\n"
+ " input/output will be used instead.")
+ .run();
+
+ ifstream input;
+ ofstream output;
+
+ switch(ap.files().size())
+ {
+ case 2:
+ output.open(ap.files()[1].c_str());
+ if (!output) {
+ throw IoError("Cannot open the file for writing", ap.files()[1]);
+ }
+ case 1:
+ input.open(ap.files()[0].c_str());
+ if (!input) {
+ throw IoError("File cannot be found", ap.files()[0]);
+ }
+ case 0:
+ break;
+ default:
+ cerr << ap.commandName() << ": too many arguments\n";
+ return 1;
+ }
+ istream& is = (ap.files().size()<1 ? cin : input);
+ ostream& os = (ap.files().size()<2 ? cout : output);
+
+ DimacsDescriptor desc = dimacsType(is);
+ switch(desc.type)
+ {
+ case DimacsDescriptor::MIN:
+ {
+ Digraph digraph;
+ DoubleArcMap lower(digraph), capacity(digraph), cost(digraph);
+ DoubleNodeMap supply(digraph);
+ readDimacsMin(is, digraph, lower, capacity, cost, supply, 0, desc);
+ DigraphWriter<Digraph>(digraph, os).
+ nodeMap("supply", supply).
+ arcMap("lower", lower).
+ arcMap("capacity", capacity).
+ arcMap("cost", cost).
+ attribute("problem","min").
+ run();
+ }
+ break;
+ case DimacsDescriptor::MAX:
+ {
+ Digraph digraph;
+ Node s, t;
+ DoubleArcMap capacity(digraph);
+ readDimacsMax(is, digraph, capacity, s, t, 0, desc);
+ DigraphWriter<Digraph>(digraph, os).
+ arcMap("capacity", capacity).
+ node("source", s).
+ node("target", t).
+ attribute("problem","max").
+ run();
+ }
+ break;
+ case DimacsDescriptor::SP:
+ {
+ Digraph digraph;
+ Node s;
+ DoubleArcMap capacity(digraph);
+ readDimacsSp(is, digraph, capacity, s, desc);
+ DigraphWriter<Digraph>(digraph, os).
+ arcMap("capacity", capacity).
+ node("source", s).
+ attribute("problem","sp").
+ run();
+ }
+ break;
+ case DimacsDescriptor::MAT:
+ {
+ Digraph digraph;
+ readDimacsMat(is, digraph,desc);
+ DigraphWriter<Digraph>(digraph, os).
+ attribute("problem","mat").
+ run();
+ }
+ break;
+ default:
+ break;
+ }
+ return 0;
+}