alpar@2404: /* -*- C++ -*- alpar@2404: * alpar@2404: * This file is a part of LEMON, a generic C++ optimization library alpar@2404: * alpar@2404: * Copyright (C) 2003-2007 alpar@2404: * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport alpar@2404: * (Egervary Research Group on Combinatorial Optimization, EGRES). alpar@2404: * alpar@2404: * Permission to use, modify and distribute this software is granted alpar@2404: * provided that this copyright notice appears in all copies. For alpar@2404: * precise terms see the accompanying LICENSE file. alpar@2404: * alpar@2404: * This software is provided "AS IS" with no warranty of any kind, alpar@2404: * express or implied, and with no claim as to its suitability for any alpar@2404: * purpose. alpar@2404: * alpar@2404: */ alpar@2404: alpar@2404: ///\ingroup demos alpar@2404: ///\file alpar@2404: ///\brief DIMACS to LGF converter (demo). alpar@2404: /// alpar@2404: /// This program converts various DIMACS formats to the LEMON Graph Format alpar@2404: /// (LGF). alpar@2404: /// alpar@2404: /// \include dim_to_lgf.cc alpar@2404: alpar@2404: #include alpar@2404: #include alpar@2404: #include alpar@2404: alpar@2404: #include alpar@2404: #include alpar@2404: #include alpar@2404: alpar@2404: using namespace std; alpar@2404: using namespace lemon; alpar@2404: alpar@2404: const char* versionString = alpar@2404: "dim_to_lgf - part of lemon library\n"; alpar@2404: alpar@2404: const char* helpString = alpar@2404: "DIMACS to LGF converter\n" alpar@2404: "Usage: dim_to_lgf [OPTIONS]\n" alpar@2404: "\n" alpar@2404: "Examples:\n" alpar@2404: " dim_to_lgf --type shortestpath --input graph.dim --output graph.lgf\n" alpar@2404: "\n" alpar@2404: "Options:\n" alpar@2404: " -i FILE, --input FILE use FILE as input instead of standard input\n" alpar@2404: " -o FILE, --output FILE use FILE as output instead of standard output\n" alpar@2404: " -t TYPE, --type TYPE set up the type of the graph\n" alpar@2404: " Possible types:\n" alpar@2404: " mincostflow\n" alpar@2404: " maxflow (default)\n" alpar@2404: " shortestpath\n" alpar@2404: " capacitated\n" alpar@2404: " plain\n" alpar@2404: " -v, --version shows the version of the converter\n" alpar@2404: " -h, --help shows the help of the converter\n"; alpar@2404: alpar@2404: alpar@2404: int main(int argc, const char *argv[]) { alpar@2404: typedef SmartGraph Graph; alpar@2404: alpar@2404: typedef Graph::Edge Edge; alpar@2404: typedef Graph::Node Node; alpar@2404: typedef Graph::EdgeIt EdgeIt; alpar@2404: typedef Graph::NodeIt NodeIt; alpar@2404: typedef Graph::EdgeMap DoubleMap; alpar@2404: alpar@2404: std::string inputName; alpar@2404: std::string outputName; alpar@2404: std::string typeName; alpar@2404: alpar@2404: bool help = false; alpar@2404: bool version = false; alpar@2404: alpar@2404: for (int arg = 1; arg < argc; ++arg) { alpar@2404: if (strcmp(argv[arg], "--type") == 0 || alpar@2404: strcmp(argv[arg], "-t") == 0) { alpar@2404: if (!typeName.empty()) { alpar@2404: cerr << "Multiple type description" << endl; alpar@2404: return -1; alpar@2404: } alpar@2404: if (arg + 1 == argc) { alpar@2404: cerr << "Parameter without value" << endl; alpar@2404: return -1; alpar@2404: } alpar@2404: typeName = argv[++arg]; alpar@2404: } alpar@2404: else if (strcmp(argv[arg], "--input") == 0 || alpar@2404: strcmp(argv[arg], "-i") == 0) { alpar@2404: if (!inputName.empty()) { alpar@2404: cerr << "Multiple input description" << endl; alpar@2404: return -1; alpar@2404: } alpar@2404: if (arg + 1 == argc) { alpar@2404: cerr << "Parameter without value" << endl; alpar@2404: return -1; alpar@2404: } alpar@2404: inputName = argv[++arg]; alpar@2404: } alpar@2404: else if (strcmp(argv[arg], "--output") == 0 || alpar@2404: strcmp(argv[arg], "-o") == 0) { alpar@2404: if (!outputName.empty()) { alpar@2404: cerr << "Multiple input description" << endl; alpar@2404: return -1; alpar@2404: } alpar@2404: if (arg + 1 == argc) { alpar@2404: cerr << "Parameter without value" << endl; alpar@2404: return -1; alpar@2404: } alpar@2404: outputName = argv[++arg]; alpar@2404: } else if (strcmp(argv[arg], "--help") == 0 || alpar@2404: strcmp(argv[arg], "-h") == 0) { alpar@2404: help = true; alpar@2404: } else if (strcmp(argv[arg], "--version") == 0 || alpar@2404: strcmp(argv[arg], "-v") == 0) { alpar@2404: version = true; alpar@2404: } else { alpar@2404: cerr << "Invalid option: " << argv[arg] << endl; alpar@2404: return -1; alpar@2404: } alpar@2404: } alpar@2404: alpar@2404: if (version) { alpar@2404: cout << versionString; alpar@2404: } alpar@2404: if (help) { alpar@2404: cout << helpString; alpar@2404: } alpar@2404: if (help || version) { alpar@2404: return 0; alpar@2404: } alpar@2404: alpar@2404: ifstream input; alpar@2404: if (!inputName.empty()) { alpar@2404: input.open(inputName.c_str()); alpar@2404: if (!input) { alpar@2404: cerr << "File open error" << endl; alpar@2404: return -1; alpar@2404: } alpar@2404: } alpar@2404: istream& is = (inputName.empty() ? cin : input); alpar@2404: alpar@2404: ofstream output; alpar@2404: if (!outputName.empty()) { alpar@2404: output.open(outputName.c_str()); alpar@2404: if (!output) { alpar@2404: cerr << "File open error" << endl; alpar@2404: return -1; alpar@2404: } alpar@2404: } alpar@2404: ostream& os = (outputName.empty() ? cout : output); alpar@2404: alpar@2404: if (typeName.empty()) { alpar@2404: typeName = "maxflow"; alpar@2404: } alpar@2404: alpar@2404: if (typeName == "mincostflow") { alpar@2404: Graph graph; alpar@2404: Node s, t; alpar@2404: DoubleMap cost(graph), capacity(graph); alpar@2404: readDimacs(is, graph, capacity, s, t, cost); alpar@2404: GraphWriter(os, graph). alpar@2404: writeEdgeMap("capacity", capacity). alpar@2404: writeNode("source", s). alpar@2404: writeNode("target", t). alpar@2404: writeEdgeMap("cost", cost). alpar@2404: run(); alpar@2404: } else if (typeName == "maxflow") { alpar@2404: Graph graph; alpar@2404: Node s, t; alpar@2404: DoubleMap capacity(graph); alpar@2404: readDimacs(is, graph, capacity, s, t); alpar@2404: GraphWriter(os, graph). alpar@2404: writeEdgeMap("capacity", capacity). alpar@2404: writeNode("source", s). alpar@2404: writeNode("target", t). alpar@2404: run(); alpar@2404: } else if (typeName == "shortestpath") { alpar@2404: Graph graph; alpar@2404: Node s; alpar@2404: DoubleMap capacity(graph); alpar@2404: readDimacs(is, graph, capacity, s); alpar@2404: GraphWriter(os, graph). alpar@2404: writeEdgeMap("capacity", capacity). alpar@2404: writeNode("source", s). alpar@2404: run(); alpar@2404: } else if (typeName == "capacitated") { alpar@2404: Graph graph; alpar@2404: DoubleMap capacity(graph); alpar@2404: readDimacs(is, graph, capacity); alpar@2404: GraphWriter(os, graph). alpar@2404: writeEdgeMap("capacity", capacity). alpar@2404: run(); alpar@2404: } else if (typeName == "plain") { alpar@2404: Graph graph; alpar@2404: readDimacs(is, graph); alpar@2404: GraphWriter(os, graph).run(); alpar@2404: } else { alpar@2404: cerr << "Invalid type error" << endl; alpar@2404: return -1; alpar@2404: } alpar@2404: return 0; alpar@2404: }