lemon/bits/default_map.h
author Peter Kovacs <kpeter@inf.elte.hu>
Tue, 24 Mar 2009 00:18:25 +0100
changeset 604 8c3112a66878
parent 517 2b6d5d22bb23
parent 491 39aaeea2d471
child 617 4137ef9aacc6
permissions -rw-r--r--
Use XTI implementation instead of ATI in NetworkSimplex (#234)

XTI (eXtended Threaded Index) is an imporved version of the widely
known ATI (Augmented Threaded Index) method for storing and updating
the spanning tree structure in Network Simplex algorithms.

In the ATI data structure three indices are stored for each node:
predecessor, thread and depth. In the XTI data structure depth is
replaced by the number of successors and the last successor
(according to the thread index).
     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 #ifndef LEMON_BITS_DEFAULT_MAP_H
    20 #define LEMON_BITS_DEFAULT_MAP_H
    21 
    22 #include <lemon/config.h>
    23 #include <lemon/bits/array_map.h>
    24 #include <lemon/bits/vector_map.h>
    25 //#include <lemon/bits/debug_map.h>
    26 
    27 //\ingroup graphbits
    28 //\file
    29 //\brief Graph maps that construct and destruct their elements dynamically.
    30 
    31 namespace lemon {
    32 
    33 
    34   //#ifndef LEMON_USE_DEBUG_MAP
    35 
    36   template <typename _Graph, typename _Item, typename _Value>
    37   struct DefaultMapSelector {
    38     typedef ArrayMap<_Graph, _Item, _Value> Map;
    39   };
    40 
    41   // bool
    42   template <typename _Graph, typename _Item>
    43   struct DefaultMapSelector<_Graph, _Item, bool> {
    44     typedef VectorMap<_Graph, _Item, bool> Map;
    45   };
    46 
    47   // char
    48   template <typename _Graph, typename _Item>
    49   struct DefaultMapSelector<_Graph, _Item, char> {
    50     typedef VectorMap<_Graph, _Item, char> Map;
    51   };
    52 
    53   template <typename _Graph, typename _Item>
    54   struct DefaultMapSelector<_Graph, _Item, signed char> {
    55     typedef VectorMap<_Graph, _Item, signed char> Map;
    56   };
    57 
    58   template <typename _Graph, typename _Item>
    59   struct DefaultMapSelector<_Graph, _Item, unsigned char> {
    60     typedef VectorMap<_Graph, _Item, unsigned char> Map;
    61   };
    62 
    63 
    64   // int
    65   template <typename _Graph, typename _Item>
    66   struct DefaultMapSelector<_Graph, _Item, signed int> {
    67     typedef VectorMap<_Graph, _Item, signed int> Map;
    68   };
    69 
    70   template <typename _Graph, typename _Item>
    71   struct DefaultMapSelector<_Graph, _Item, unsigned int> {
    72     typedef VectorMap<_Graph, _Item, unsigned int> Map;
    73   };
    74 
    75 
    76   // short
    77   template <typename _Graph, typename _Item>
    78   struct DefaultMapSelector<_Graph, _Item, signed short> {
    79     typedef VectorMap<_Graph, _Item, signed short> Map;
    80   };
    81 
    82   template <typename _Graph, typename _Item>
    83   struct DefaultMapSelector<_Graph, _Item, unsigned short> {
    84     typedef VectorMap<_Graph, _Item, unsigned short> Map;
    85   };
    86 
    87 
    88   // long
    89   template <typename _Graph, typename _Item>
    90   struct DefaultMapSelector<_Graph, _Item, signed long> {
    91     typedef VectorMap<_Graph, _Item, signed long> Map;
    92   };
    93 
    94   template <typename _Graph, typename _Item>
    95   struct DefaultMapSelector<_Graph, _Item, unsigned long> {
    96     typedef VectorMap<_Graph, _Item, unsigned long> Map;
    97   };
    98 
    99 
   100 #if defined HAVE_LONG_LONG
   101 
   102   // long long
   103   template <typename _Graph, typename _Item>
   104   struct DefaultMapSelector<_Graph, _Item, signed long long> {
   105     typedef VectorMap<_Graph, _Item, signed long long> Map;
   106   };
   107 
   108   template <typename _Graph, typename _Item>
   109   struct DefaultMapSelector<_Graph, _Item, unsigned long long> {
   110     typedef VectorMap<_Graph, _Item, unsigned long long> Map;
   111   };
   112 
   113 #endif
   114 
   115 
   116   // float
   117   template <typename _Graph, typename _Item>
   118   struct DefaultMapSelector<_Graph, _Item, float> {
   119     typedef VectorMap<_Graph, _Item, float> Map;
   120   };
   121 
   122 
   123   // double
   124   template <typename _Graph, typename _Item>
   125   struct DefaultMapSelector<_Graph, _Item, double> {
   126     typedef VectorMap<_Graph, _Item,  double> Map;
   127   };
   128 
   129 
   130   // long double
   131   template <typename _Graph, typename _Item>
   132   struct DefaultMapSelector<_Graph, _Item, long double> {
   133     typedef VectorMap<_Graph, _Item, long double> Map;
   134   };
   135 
   136 
   137   // pointer
   138   template <typename _Graph, typename _Item, typename _Ptr>
   139   struct DefaultMapSelector<_Graph, _Item, _Ptr*> {
   140     typedef VectorMap<_Graph, _Item, _Ptr*> Map;
   141   };
   142 
   143 // #else
   144 
   145 //   template <typename _Graph, typename _Item, typename _Value>
   146 //   struct DefaultMapSelector {
   147 //     typedef DebugMap<_Graph, _Item, _Value> Map;
   148 //   };
   149 
   150 // #endif
   151 
   152   // DefaultMap class
   153   template <typename _Graph, typename _Item, typename _Value>
   154   class DefaultMap
   155     : public DefaultMapSelector<_Graph, _Item, _Value>::Map {
   156   public:
   157     typedef typename DefaultMapSelector<_Graph, _Item, _Value>::Map Parent;
   158     typedef DefaultMap<_Graph, _Item, _Value> Map;
   159 
   160     typedef typename Parent::Graph Graph;
   161     typedef typename Parent::Value Value;
   162 
   163     explicit DefaultMap(const Graph& graph) : Parent(graph) {}
   164     DefaultMap(const Graph& graph, const Value& value)
   165       : Parent(graph, value) {}
   166 
   167     DefaultMap& operator=(const DefaultMap& cmap) {
   168       return operator=<DefaultMap>(cmap);
   169     }
   170 
   171     template <typename CMap>
   172     DefaultMap& operator=(const CMap& cmap) {
   173       Parent::operator=(cmap);
   174       return *this;
   175     }
   176 
   177   };
   178 
   179 }
   180 
   181 #endif