doc/maps.dox
author hegyi
Mon, 21 Nov 2005 18:03:20 +0000
changeset 1823 cb082cdf3667
parent 1183 8f623d1833a7
child 2260 4274224f8a7d
permissions -rw-r--r--
NewMapWin has become Dialog instead of Window. Therefore it is created dynamically, when there is need for it, instead of keeping one instance in memory. This solution is slower, but more correct than before.
alpar@1083
     1
namespace lemon{
alpar@202
     2
/*!
alpar@202
     3
alpar@1043
     4
\page maps-page Maps
alpar@692
     5
athos@1167
     6
Maps play a central role in LEMON. As their name suggests, they map a
alpar@692
     7
certain range of \e keys to certain \e values. Each map has two
alpar@692
     8
<tt>typedef</tt>'s to determine the types of keys and values, like this:
alpar@692
     9
alpar@692
    10
\code
alpar@987
    11
  typedef Edge Key;
alpar@987
    12
  typedef double Value;
alpar@692
    13
\endcode
alpar@692
    14
athos@1183
    15
A map can be 
athos@1183
    16
\e readable (\ref lemon::concept::ReadMap "ReadMap", for short),
alpar@1083
    17
\e writable (\ref lemon::concept::WriteMap "WriteMap") or both
alpar@1083
    18
(\ref lemon::concept::ReadWriteMap "ReadWriteMap").
alpar@1083
    19
There also exists a special type of
alpar@1083
    20
ReadWrite map called \ref lemon::concept::ReferenceMap "reference map".
alpar@1083
    21
In addition that you can
alpar@692
    22
read and write the values of a key, a reference map
alpar@692
    23
can also give you a reference to the
alpar@692
    24
value belonging to a key, so you have a direct access to the memory address
alpar@692
    25
where it is stored.
alpar@692
    26
alpar@921
    27
Each graph structure in LEMON provides two standard map templates called
alpar@692
    28
\c EdgeMap and \c NodeMap. Both are reference maps and you can easily
alpar@692
    29
assign data to the nodes and to the edges of the graph. For example if you
deba@1788
    30
have a graph \c g defined as
alpar@692
    31
\code
deba@1788
    32
  ListGraph g;
alpar@692
    33
\endcode
alpar@1083
    34
and you want to assign a floating point value to each edge, you can do
alpar@692
    35
it like this.
alpar@692
    36
\code
deba@1788
    37
  ListGraph::EdgeMap<double> length(g);
alpar@692
    38
\endcode
alpar@1083
    39
Note that you must give the underlying graph to the constructor.
alpar@692
    40
alpar@692
    41
The value of a readable map can be obtained by <tt>operator[]</tt>.
alpar@692
    42
\code
alpar@692
    43
  d=length[e];
alpar@692
    44
\endcode
alpar@692
    45
where \c e is an instance of \c ListGraph::Edge.
alpar@692
    46
(Or anything else
alpar@692
    47
that converts to \c ListGraph::Edge, like  \c ListGraph::EdgeIt or
alpar@1083
    48
\c ListGraph::OutEdgeIt etc.)
alpar@692
    49
athos@1167
    50
There are two ways to assign a new value to a key
alpar@692
    51
alpar@692
    52
- In case of a <em>reference map</em> <tt>operator[]</tt>
alpar@692
    53
gives you a reference to the
alpar@692
    54
value, thus you can use this.
alpar@692
    55
\code
alpar@692
    56
  length[e]=3.5;
alpar@692
    57
\endcode
alpar@692
    58
- <em>Writable maps</em> have
alpar@987
    59
a member function \c set(Key,const Value &)
alpar@692
    60
for this purpose.
alpar@692
    61
\code
alpar@692
    62
  length.set(e,3.5);
alpar@692
    63
\endcode
alpar@692
    64
alpar@692
    65
The first case is more comfortable and if you store complex structures in your
alpar@692
    66
map, it might be more efficient. However, there are writable but
alpar@1083
    67
not reference maps, so if you want to write a generic algorithm, you should
alpar@1083
    68
insist on the second way.
alpar@692
    69
alpar@697
    70
\section how-to-write-your-own-map How to Write Your Own Maps
alpar@692
    71
alpar@692
    72
\subsection read-maps Readable Maps
alpar@202
    73
athos@1167
    74
Readable maps are very frequently used as the input of an
athos@1167
    75
algorithm.  For this purpose the most straightforward way is the use of the
alpar@921
    76
default maps provided by LEMON's graph structures.
alpar@692
    77
Very often however, it is more
alpar@289
    78
convenient and/or more efficient to write your own readable map.
alpar@202
    79
alpar@692
    80
You can find some examples below. In these examples \c Graph is the
alpar@692
    81
type of the particular graph structure you use.
alpar@692
    82
alpar@202
    83
alpar@204
    84
This simple map assigns \f$\pi\f$ to each edge.
alpar@204
    85
alpar@202
    86
\code
alpar@273
    87
struct MyMap 
alpar@202
    88
{
alpar@987
    89
  typedef double Value;
alpar@987
    90
  typedef Graph::Edge Key;
alpar@987
    91
  double operator[](Key e) const { return M_PI;}
alpar@204
    92
};
alpar@204
    93
\endcode
alpar@204
    94
alpar@692
    95
An alternative way to define maps is to use \c MapBase
alpar@692
    96
alpar@289
    97
\code
alpar@692
    98
struct MyMap : public MapBase<Graph::Edge,double>
alpar@289
    99
{
alpar@987
   100
  Value operator[](Key e) const { return M_PI;}
alpar@289
   101
};
alpar@289
   102
\endcode
alpar@289
   103
alpar@692
   104
Here is a bit more complex example.
alpar@1083
   105
It provides a length function obtained
alpar@692
   106
from a base length function shifted by a potential difference.
alpar@202
   107
alpar@202
   108
\code
alpar@1083
   109
class ReducedLengthMap  : public MapBase<Graph::Edge,double>
alpar@202
   110
{
alpar@1083
   111
  const Graph &g;
alpar@692
   112
  const Graph::EdgeMap<double> &orig_len;
alpar@692
   113
  const Graph::NodeMap<double> &pot;
alpar@202
   114
  
alpar@273
   115
public:
alpar@987
   116
  Value operator[](Key e) const {
deba@1788
   117
    return orig_len[e]-(pot[g.target(e)]-pot[g.source(e)]);
alpar@210
   118
  }
alpar@202
   119
  
alpar@1083
   120
  ReducedLengthMap(const Graph &_g,
deba@1788
   121
                   const Graph::EdgeMap &_o,
deba@1788
   122
                   const Graph::NodeMap &_p)
deba@1788
   123
    : g(_g), orig_len(_o), pot(_p) {};
alpar@202
   124
};
alpar@202
   125
\endcode
alpar@202
   126
alpar@1083
   127
Then, you can call e.g. Dijkstra algoritm on this map like this:
alpar@1083
   128
\code
alpar@1083
   129
  ...
alpar@1083
   130
  ReducedLengthMap rm(g,len,pot);
alpar@1083
   131
  Dijkstra<Graph,ReducedLengthMap> dij(g,rm);
alpar@1083
   132
  dij.run(s);
alpar@1083
   133
  ...
alpar@1083
   134
\endcode
alpar@1083
   135
alpar@692
   136
alpar@692
   137
\subsection write-maps Writable Maps
alpar@692
   138
alpar@692
   139
To be written...
alpar@692
   140
alpar@692
   141
\subsection side-effect-maps Maps with Side Effect
alpar@692
   142
alpar@692
   143
To be written...
alpar@692
   144
alpar@202
   145
*/
athos@1183
   146
}