tools/dimacs-to-lgf.cc
author Alpar Juttner <alpar@cs.elte.hu>
Wed, 15 May 2019 13:33:55 +0200
branch1.2
changeset 1424 7edc220d6244
parent 631 33c6b6e755cd
permissions -rw-r--r--
Backport relevant parts of bugfixes [ad22262328b3], [61fdd06833a6] and [4add05447ca0] to branch 1.2 (#623)
     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-2009
     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 /// \code
    28 ///   dimacs-to-lgf --help
    29 /// \endcode
    30 /// for more info on the usage.
    31 
    32 #include <iostream>
    33 #include <fstream>
    34 #include <cstring>
    35 
    36 #include <lemon/smart_graph.h>
    37 #include <lemon/dimacs.h>
    38 #include <lemon/lgf_writer.h>
    39 
    40 #include <lemon/arg_parser.h>
    41 #include <lemon/error.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 
    60   ArgParser ap(argc, argv);
    61   ap.other("[INFILE [OUTFILE]]",
    62            "If either the INFILE or OUTFILE file is missing the standard\n"
    63            "     input/output will be used instead.")
    64     .run();
    65 
    66   ifstream input;
    67   ofstream output;
    68 
    69   switch(ap.files().size())
    70     {
    71     case 2:
    72       output.open(ap.files()[1].c_str());
    73       if (!output) {
    74         throw IoError("Cannot open the file for writing", ap.files()[1]);
    75       }
    76       // fall through
    77     case 1:
    78       input.open(ap.files()[0].c_str());
    79       if (!input) {
    80         throw IoError("File cannot be found", ap.files()[0]);
    81       }
    82       // fall through
    83     case 0:
    84       break;
    85     default:
    86       cerr << ap.commandName() << ": too many arguments\n";
    87       return 1;
    88   }
    89   istream& is = (ap.files().size()<1 ? cin : input);
    90   ostream& os = (ap.files().size()<2 ? cout : output);
    91 
    92   DimacsDescriptor desc = dimacsType(is);
    93   switch(desc.type)
    94     {
    95     case DimacsDescriptor::MIN:
    96       {
    97         Digraph digraph;
    98         DoubleArcMap lower(digraph), capacity(digraph), cost(digraph);
    99         DoubleNodeMap supply(digraph);
   100         readDimacsMin(is, digraph, lower, capacity, cost, supply, 0, desc);
   101         DigraphWriter<Digraph>(digraph, os).
   102           nodeMap("supply", supply).
   103           arcMap("lower", lower).
   104           arcMap("capacity", capacity).
   105           arcMap("cost", cost).
   106           attribute("problem","min").
   107           run();
   108       }
   109       break;
   110     case DimacsDescriptor::MAX:
   111       {
   112         Digraph digraph;
   113         Node s, t;
   114         DoubleArcMap capacity(digraph);
   115         readDimacsMax(is, digraph, capacity, s, t, 0, desc);
   116         DigraphWriter<Digraph>(digraph, os).
   117           arcMap("capacity", capacity).
   118           node("source", s).
   119           node("target", t).
   120           attribute("problem","max").
   121           run();
   122       }
   123       break;
   124     case DimacsDescriptor::SP:
   125       {
   126         Digraph digraph;
   127         Node s;
   128         DoubleArcMap capacity(digraph);
   129         readDimacsSp(is, digraph, capacity, s, desc);
   130         DigraphWriter<Digraph>(digraph, os).
   131           arcMap("capacity", capacity).
   132           node("source", s).
   133           attribute("problem","sp").
   134           run();
   135       }
   136       break;
   137     case DimacsDescriptor::MAT:
   138       {
   139         Digraph digraph;
   140         readDimacsMat(is, digraph,desc);
   141         DigraphWriter<Digraph>(digraph, os).
   142           attribute("problem","mat").
   143           run();
   144       }
   145       break;
   146     default:
   147       break;
   148     }
   149   return 0;
   150 }