gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Rearrange modules (#303)
0 2 0
default
2 files changed with 71 insertions and 64 deletions:
↑ Collapse diff ↑
Ignore white space 384 line context
... ...
@@ -37,636 +37,650 @@
37 37
usage of different physical graph implementations. These differences
38 38
appear in the size of graph we require to handle, memory or time usage
39 39
limitations or in the set of operations through which the graph can be
40 40
accessed.  LEMON provides several physical graph structures to meet
41 41
the diverging requirements of the possible users.  In order to save on
42 42
running time or on memory usage, some structures may fail to provide
43 43
some graph features like arc/edge or node deletion.
44 44

	
45 45
Alteration of standard containers need a very limited number of
46 46
operations, these together satisfy the everyday requirements.
47 47
In the case of graph structures, different operations are needed which do
48 48
not alter the physical graph, but gives another view. If some nodes or
49 49
arcs have to be hidden or the reverse oriented graph have to be used, then
50 50
this is the case. It also may happen that in a flow implementation
51 51
the residual graph can be accessed by another algorithm, or a node-set
52 52
is to be shrunk for another algorithm.
53 53
LEMON also provides a variety of graphs for these requirements called
54 54
\ref graph_adaptors "graph adaptors". Adaptors cannot be used alone but only
55 55
in conjunction with other graph representations.
56 56

	
57 57
You are free to use the graph structure that fit your requirements
58 58
the best, most graph algorithms and auxiliary data structures can be used
59 59
with any graph structure.
60 60

	
61 61
<b>See also:</b> \ref graph_concepts "Graph Structure Concepts".
62 62
*/
63 63

	
64 64
/**
65 65
@defgroup graph_adaptors Adaptor Classes for Graphs
66 66
@ingroup graphs
67 67
\brief Adaptor classes for digraphs and graphs
68 68

	
69 69
This group contains several useful adaptor classes for digraphs and graphs.
70 70

	
71 71
The main parts of LEMON are the different graph structures, generic
72 72
graph algorithms, graph concepts, which couple them, and graph
73 73
adaptors. While the previous notions are more or less clear, the
74 74
latter one needs further explanation. Graph adaptors are graph classes
75 75
which serve for considering graph structures in different ways.
76 76

	
77 77
A short example makes this much clearer.  Suppose that we have an
78 78
instance \c g of a directed graph type, say ListDigraph and an algorithm
79 79
\code
80 80
template <typename Digraph>
81 81
int algorithm(const Digraph&);
82 82
\endcode
83 83
is needed to run on the reverse oriented graph.  It may be expensive
84 84
(in time or in memory usage) to copy \c g with the reversed
85 85
arcs.  In this case, an adaptor class is used, which (according
86 86
to LEMON \ref concepts::Digraph "digraph concepts") works as a digraph.
87 87
The adaptor uses the original digraph structure and digraph operations when
88 88
methods of the reversed oriented graph are called.  This means that the adaptor
89 89
have minor memory usage, and do not perform sophisticated algorithmic
90 90
actions.  The purpose of it is to give a tool for the cases when a
91 91
graph have to be used in a specific alteration.  If this alteration is
92 92
obtained by a usual construction like filtering the node or the arc set or
93 93
considering a new orientation, then an adaptor is worthwhile to use.
94 94
To come back to the reverse oriented graph, in this situation
95 95
\code
96 96
template<typename Digraph> class ReverseDigraph;
97 97
\endcode
98 98
template class can be used. The code looks as follows
99 99
\code
100 100
ListDigraph g;
101 101
ReverseDigraph<ListDigraph> rg(g);
102 102
int result = algorithm(rg);
103 103
\endcode
104 104
During running the algorithm, the original digraph \c g is untouched.
105 105
This techniques give rise to an elegant code, and based on stable
106 106
graph adaptors, complex algorithms can be implemented easily.
107 107

	
108 108
In flow, circulation and matching problems, the residual
109 109
graph is of particular importance. Combining an adaptor implementing
110 110
this with shortest path algorithms or minimum mean cycle algorithms,
111 111
a range of weighted and cardinality optimization algorithms can be
112 112
obtained. For other examples, the interested user is referred to the
113 113
detailed documentation of particular adaptors.
114 114

	
115 115
The behavior of graph adaptors can be very different. Some of them keep
116 116
capabilities of the original graph while in other cases this would be
117 117
meaningless. This means that the concepts that they meet depend
118 118
on the graph adaptor, and the wrapped graph.
119 119
For example, if an arc of a reversed digraph is deleted, this is carried
120 120
out by deleting the corresponding arc of the original digraph, thus the
121 121
adaptor modifies the original digraph.
122 122
However in case of a residual digraph, this operation has no sense.
123 123

	
124 124
Let us stand one more example here to simplify your work.
125 125
ReverseDigraph has constructor
126 126
\code
127 127
ReverseDigraph(Digraph& digraph);
128 128
\endcode
129 129
This means that in a situation, when a <tt>const %ListDigraph&</tt>
130 130
reference to a graph is given, then it have to be instantiated with
131 131
<tt>Digraph=const %ListDigraph</tt>.
132 132
\code
133 133
int algorithm1(const ListDigraph& g) {
134 134
  ReverseDigraph<const ListDigraph> rg(g);
135 135
  return algorithm2(rg);
136 136
}
137 137
\endcode
138 138
*/
139 139

	
140 140
/**
141 141
@defgroup maps Maps
142 142
@ingroup datas
143 143
\brief Map structures implemented in LEMON.
144 144

	
145 145
This group contains the map structures implemented in LEMON.
146 146

	
147 147
LEMON provides several special purpose maps and map adaptors that e.g. combine
148 148
new maps from existing ones.
149 149

	
150 150
<b>See also:</b> \ref map_concepts "Map Concepts".
151 151
*/
152 152

	
153 153
/**
154 154
@defgroup graph_maps Graph Maps
155 155
@ingroup maps
156 156
\brief Special graph-related maps.
157 157

	
158 158
This group contains maps that are specifically designed to assign
159 159
values to the nodes and arcs/edges of graphs.
160 160

	
161 161
If you are looking for the standard graph maps (\c NodeMap, \c ArcMap,
162 162
\c EdgeMap), see the \ref graph_concepts "Graph Structure Concepts".
163 163
*/
164 164

	
165 165
/**
166 166
\defgroup map_adaptors Map Adaptors
167 167
\ingroup maps
168 168
\brief Tools to create new maps from existing ones
169 169

	
170 170
This group contains map adaptors that are used to create "implicit"
171 171
maps from other maps.
172 172

	
173 173
Most of them are \ref concepts::ReadMap "read-only maps".
174 174
They can make arithmetic and logical operations between one or two maps
175 175
(negation, shifting, addition, multiplication, logical 'and', 'or',
176 176
'not' etc.) or e.g. convert a map to another one of different Value type.
177 177

	
178 178
The typical usage of this classes is passing implicit maps to
179 179
algorithms.  If a function type algorithm is called then the function
180 180
type map adaptors can be used comfortable. For example let's see the
181 181
usage of map adaptors with the \c graphToEps() function.
182 182
\code
183 183
  Color nodeColor(int deg) {
184 184
    if (deg >= 2) {
185 185
      return Color(0.5, 0.0, 0.5);
186 186
    } else if (deg == 1) {
187 187
      return Color(1.0, 0.5, 1.0);
188 188
    } else {
189 189
      return Color(0.0, 0.0, 0.0);
190 190
    }
191 191
  }
192 192

	
193 193
  Digraph::NodeMap<int> degree_map(graph);
194 194

	
195 195
  graphToEps(graph, "graph.eps")
196 196
    .coords(coords).scaleToA4().undirected()
197 197
    .nodeColors(composeMap(functorToMap(nodeColor), degree_map))
198 198
    .run();
199 199
\endcode
200 200
The \c functorToMap() function makes an \c int to \c Color map from the
201 201
\c nodeColor() function. The \c composeMap() compose the \c degree_map
202 202
and the previously created map. The composed map is a proper function to
203 203
get the color of each node.
204 204

	
205 205
The usage with class type algorithms is little bit harder. In this
206 206
case the function type map adaptors can not be used, because the
207 207
function map adaptors give back temporary objects.
208 208
\code
209 209
  Digraph graph;
210 210

	
211 211
  typedef Digraph::ArcMap<double> DoubleArcMap;
212 212
  DoubleArcMap length(graph);
213 213
  DoubleArcMap speed(graph);
214 214

	
215 215
  typedef DivMap<DoubleArcMap, DoubleArcMap> TimeMap;
216 216
  TimeMap time(length, speed);
217 217

	
218 218
  Dijkstra<Digraph, TimeMap> dijkstra(graph, time);
219 219
  dijkstra.run(source, target);
220 220
\endcode
221 221
We have a length map and a maximum speed map on the arcs of a digraph.
222 222
The minimum time to pass the arc can be calculated as the division of
223 223
the two maps which can be done implicitly with the \c DivMap template
224 224
class. We use the implicit minimum time map as the length map of the
225 225
\c Dijkstra algorithm.
226 226
*/
227 227

	
228 228
/**
229
@defgroup matrices Matrices
230
@ingroup datas
231
\brief Two dimensional data storages implemented in LEMON.
232

	
233
This group contains two dimensional data storages implemented in LEMON.
234
*/
235

	
236
/**
237 229
@defgroup paths Path Structures
238 230
@ingroup datas
239 231
\brief %Path structures implemented in LEMON.
240 232

	
241 233
This group contains the path structures implemented in LEMON.
242 234

	
243 235
LEMON provides flexible data structures to work with paths.
244 236
All of them have similar interfaces and they can be copied easily with
245 237
assignment operators and copy constructors. This makes it easy and
246 238
efficient to have e.g. the Dijkstra algorithm to store its result in
247 239
any kind of path structure.
248 240

	
249 241
\sa lemon::concepts::Path
250 242
*/
251 243

	
252 244
/**
253 245
@defgroup auxdat Auxiliary Data Structures
254 246
@ingroup datas
255 247
\brief Auxiliary data structures implemented in LEMON.
256 248

	
257 249
This group contains some data structures implemented in LEMON in
258 250
order to make it easier to implement combinatorial algorithms.
259 251
*/
260 252

	
261 253
/**
254
@defgroup geomdat Geometric Data Structures
255
@ingroup auxdat
256
\brief Geometric data structures implemented in LEMON.
257

	
258
This group contains geometric data structures implemented in LEMON.
259

	
260
 - \ref lemon::dim2::Point "dim2::Point" implements a two dimensional
261
   vector with the usual operations.
262
 - \ref lemon::dim2::Box "dim2::Box" can be used to determine the
263
   rectangular bounding box of a set of \ref lemon::dim2::Point
264
   "dim2::Point"'s.
265
*/
266

	
267
/**
268
@defgroup matrices Matrices
269
@ingroup auxdat
270
\brief Two dimensional data storages implemented in LEMON.
271

	
272
This group contains two dimensional data storages implemented in LEMON.
273
*/
274

	
275
/**
262 276
@defgroup algs Algorithms
263 277
\brief This group contains the several algorithms
264 278
implemented in LEMON.
265 279

	
266 280
This group contains the several algorithms
267 281
implemented in LEMON.
268 282
*/
269 283

	
270 284
/**
271 285
@defgroup search Graph Search
272 286
@ingroup algs
273 287
\brief Common graph search algorithms.
274 288

	
275 289
This group contains the common graph search algorithms, namely
276 290
\e breadth-first \e search (BFS) and \e depth-first \e search (DFS).
277 291
*/
278 292

	
279 293
/**
280 294
@defgroup shortest_path Shortest Path Algorithms
281 295
@ingroup algs
282 296
\brief Algorithms for finding shortest paths.
283 297

	
284 298
This group contains the algorithms for finding shortest paths in digraphs.
285 299

	
286 300
 - \ref Dijkstra algorithm for finding shortest paths from a source node
287 301
   when all arc lengths are non-negative.
288 302
 - \ref BellmanFord "Bellman-Ford" algorithm for finding shortest paths
289 303
   from a source node when arc lenghts can be either positive or negative,
290 304
   but the digraph should not contain directed cycles with negative total
291 305
   length.
292 306
 - \ref FloydWarshall "Floyd-Warshall" and \ref Johnson "Johnson" algorithms
293 307
   for solving the \e all-pairs \e shortest \e paths \e problem when arc
294 308
   lenghts can be either positive or negative, but the digraph should
295 309
   not contain directed cycles with negative total length.
296 310
 - \ref Suurballe A successive shortest path algorithm for finding
297 311
   arc-disjoint paths between two nodes having minimum total length.
298 312
*/
299 313

	
300 314
/**
315
@defgroup spantree Minimum Spanning Tree Algorithms
316
@ingroup algs
317
\brief Algorithms for finding minimum cost spanning trees and arborescences.
318

	
319
This group contains the algorithms for finding minimum cost spanning
320
trees and arborescences.
321
*/
322

	
323
/**
301 324
@defgroup max_flow Maximum Flow Algorithms
302 325
@ingroup algs
303 326
\brief Algorithms for finding maximum flows.
304 327

	
305 328
This group contains the algorithms for finding maximum flows and
306 329
feasible circulations.
307 330

	
308 331
The \e maximum \e flow \e problem is to find a flow of maximum value between
309 332
a single source and a single target. Formally, there is a \f$G=(V,A)\f$
310 333
digraph, a \f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function and
311 334
\f$s, t \in V\f$ source and target nodes.
312 335
A maximum flow is an \f$f: A\rightarrow\mathbf{R}^+_0\f$ solution of the
313 336
following optimization problem.
314 337

	
315 338
\f[ \max\sum_{sv\in A} f(sv) - \sum_{vs\in A} f(vs) \f]
316 339
\f[ \sum_{uv\in A} f(uv) = \sum_{vu\in A} f(vu)
317 340
    \quad \forall u\in V\setminus\{s,t\} \f]
318 341
\f[ 0 \leq f(uv) \leq cap(uv) \quad \forall uv\in A \f]
319 342

	
320 343
LEMON contains several algorithms for solving maximum flow problems:
321 344
- \ref EdmondsKarp Edmonds-Karp algorithm.
322 345
- \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm.
323 346
- \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees.
324 347
- \ref GoldbergTarjan Preflow push-relabel algorithm with dynamic trees.
325 348

	
326 349
In most cases the \ref Preflow "Preflow" algorithm provides the
327 350
fastest method for computing a maximum flow. All implementations
328 351
also provide functions to query the minimum cut, which is the dual
329 352
problem of maximum flow.
330 353

	
331 354
\ref Circulation is a preflow push-relabel algorithm implemented directly 
332 355
for finding feasible circulations, which is a somewhat different problem,
333 356
but it is strongly related to maximum flow.
334 357
For more information, see \ref Circulation.
335 358
*/
336 359

	
337 360
/**
338 361
@defgroup min_cost_flow_algs Minimum Cost Flow Algorithms
339 362
@ingroup algs
340 363

	
341 364
\brief Algorithms for finding minimum cost flows and circulations.
342 365

	
343 366
This group contains the algorithms for finding minimum cost flows and
344 367
circulations. For more information about this problem and its dual
345 368
solution see \ref min_cost_flow "Minimum Cost Flow Problem".
346 369

	
347 370
LEMON contains several algorithms for this problem.
348 371
 - \ref NetworkSimplex Primal Network Simplex algorithm with various
349 372
   pivot strategies.
350 373
 - \ref CostScaling Push-Relabel and Augment-Relabel algorithms based on
351 374
   cost scaling.
352 375
 - \ref CapacityScaling Successive Shortest %Path algorithm with optional
353 376
   capacity scaling.
354 377
 - \ref CancelAndTighten The Cancel and Tighten algorithm.
355 378
 - \ref CycleCanceling Cycle-Canceling algorithms.
356 379

	
357 380
In general NetworkSimplex is the most efficient implementation,
358 381
but in special cases other algorithms could be faster.
359 382
For example, if the total supply and/or capacities are rather small,
360 383
CapacityScaling is usually the fastest algorithm (without effective scaling).
361 384
*/
362 385

	
363 386
/**
364 387
@defgroup min_cut Minimum Cut Algorithms
365 388
@ingroup algs
366 389

	
367 390
\brief Algorithms for finding minimum cut in graphs.
368 391

	
369 392
This group contains the algorithms for finding minimum cut in graphs.
370 393

	
371 394
The \e minimum \e cut \e problem is to find a non-empty and non-complete
372 395
\f$X\f$ subset of the nodes with minimum overall capacity on
373 396
outgoing arcs. Formally, there is a \f$G=(V,A)\f$ digraph, a
374 397
\f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function. The minimum
375 398
cut is the \f$X\f$ solution of the next optimization problem:
376 399

	
377 400
\f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}
378 401
    \sum_{uv\in A: u\in X, v\not\in X}cap(uv) \f]
379 402

	
380 403
LEMON contains several algorithms related to minimum cut problems:
381 404

	
382 405
- \ref HaoOrlin "Hao-Orlin algorithm" for calculating minimum cut
383 406
  in directed graphs.
384 407
- \ref NagamochiIbaraki "Nagamochi-Ibaraki algorithm" for
385 408
  calculating minimum cut in undirected graphs.
386 409
- \ref GomoryHu "Gomory-Hu tree computation" for calculating
387 410
  all-pairs minimum cut in undirected graphs.
388 411

	
389 412
If you want to find minimum cut just between two distinict nodes,
390 413
see the \ref max_flow "maximum flow problem".
391 414
*/
392 415

	
393 416
/**
394
@defgroup graph_properties Connectivity and Other Graph Properties
395
@ingroup algs
396
\brief Algorithms for discovering the graph properties
397

	
398
This group contains the algorithms for discovering the graph properties
399
like connectivity, bipartiteness, euler property, simplicity etc.
400

	
401
\image html connected_components.png
402
\image latex connected_components.eps "Connected components" width=\textwidth
403
*/
404

	
405
/**
406
@defgroup planar Planarity Embedding and Drawing
407
@ingroup algs
408
\brief Algorithms for planarity checking, embedding and drawing
409

	
410
This group contains the algorithms for planarity checking,
411
embedding and drawing.
412

	
413
\image html planar.png
414
\image latex planar.eps "Plane graph" width=\textwidth
415
*/
416

	
417
/**
418 417
@defgroup matching Matching Algorithms
419 418
@ingroup algs
420 419
\brief Algorithms for finding matchings in graphs and bipartite graphs.
421 420

	
422 421
This group contains the algorithms for calculating
423 422
matchings in graphs and bipartite graphs. The general matching problem is
424 423
finding a subset of the edges for which each node has at most one incident
425 424
edge.
426 425

	
427 426
There are several different algorithms for calculate matchings in
428 427
graphs.  The matching problems in bipartite graphs are generally
429 428
easier than in general graphs. The goal of the matching optimization
430 429
can be finding maximum cardinality, maximum weight or minimum cost
431 430
matching. The search can be constrained to find perfect or
432 431
maximum cardinality matching.
433 432

	
434 433
The matching algorithms implemented in LEMON:
435 434
- \ref MaxBipartiteMatching Hopcroft-Karp augmenting path algorithm
436 435
  for calculating maximum cardinality matching in bipartite graphs.
437 436
- \ref PrBipartiteMatching Push-relabel algorithm
438 437
  for calculating maximum cardinality matching in bipartite graphs.
439 438
- \ref MaxWeightedBipartiteMatching
440 439
  Successive shortest path algorithm for calculating maximum weighted
441 440
  matching and maximum weighted bipartite matching in bipartite graphs.
442 441
- \ref MinCostMaxBipartiteMatching
443 442
  Successive shortest path algorithm for calculating minimum cost maximum
444 443
  matching in bipartite graphs.
445 444
- \ref MaxMatching Edmond's blossom shrinking algorithm for calculating
446 445
  maximum cardinality matching in general graphs.
447 446
- \ref MaxWeightedMatching Edmond's blossom shrinking algorithm for calculating
448 447
  maximum weighted matching in general graphs.
449 448
- \ref MaxWeightedPerfectMatching
450 449
  Edmond's blossom shrinking algorithm for calculating maximum weighted
451 450
  perfect matching in general graphs.
452 451

	
453 452
\image html bipartite_matching.png
454 453
\image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth
455 454
*/
456 455

	
457 456
/**
458
@defgroup spantree Minimum Spanning Tree Algorithms
457
@defgroup graph_properties Connectivity and Other Graph Properties
459 458
@ingroup algs
460
\brief Algorithms for finding minimum cost spanning trees and arborescences.
459
\brief Algorithms for discovering the graph properties
461 460

	
462
This group contains the algorithms for finding minimum cost spanning
463
trees and arborescences.
461
This group contains the algorithms for discovering the graph properties
462
like connectivity, bipartiteness, euler property, simplicity etc.
463

	
464
\image html connected_components.png
465
\image latex connected_components.eps "Connected components" width=\textwidth
466
*/
467

	
468
/**
469
@defgroup planar Planarity Embedding and Drawing
470
@ingroup algs
471
\brief Algorithms for planarity checking, embedding and drawing
472

	
473
This group contains the algorithms for planarity checking,
474
embedding and drawing.
475

	
476
\image html planar.png
477
\image latex planar.eps "Plane graph" width=\textwidth
478
*/
479

	
480
/**
481
@defgroup approx Approximation Algorithms
482
@ingroup algs
483
\brief Approximation algorithms.
484

	
485
This group contains the approximation and heuristic algorithms
486
implemented in LEMON.
464 487
*/
465 488

	
466 489
/**
467 490
@defgroup auxalg Auxiliary Algorithms
468 491
@ingroup algs
469 492
\brief Auxiliary algorithms implemented in LEMON.
470 493

	
471 494
This group contains some algorithms implemented in LEMON
472 495
in order to make it easier to implement complex algorithms.
473 496
*/
474 497

	
475 498
/**
476
@defgroup approx Approximation Algorithms
477
@ingroup algs
478
\brief Approximation algorithms.
479

	
480
This group contains the approximation and heuristic algorithms
481
implemented in LEMON.
482
*/
483

	
484
/**
485 499
@defgroup gen_opt_group General Optimization Tools
486 500
\brief This group contains some general optimization frameworks
487 501
implemented in LEMON.
488 502

	
489 503
This group contains some general optimization frameworks
490 504
implemented in LEMON.
491 505
*/
492 506

	
493 507
/**
494 508
@defgroup lp_group Lp and Mip Solvers
495 509
@ingroup gen_opt_group
496 510
\brief Lp and Mip solver interfaces for LEMON.
497 511

	
498 512
This group contains Lp and Mip solver interfaces for LEMON. The
499 513
various LP solvers could be used in the same manner with this
500 514
interface.
501 515
*/
502 516

	
503 517
/**
504 518
@defgroup lp_utils Tools for Lp and Mip Solvers
505 519
@ingroup lp_group
506 520
\brief Helper tools to the Lp and Mip solvers.
507 521

	
508 522
This group adds some helper tools to general optimization framework
509 523
implemented in LEMON.
510 524
*/
511 525

	
512 526
/**
513 527
@defgroup metah Metaheuristics
514 528
@ingroup gen_opt_group
515 529
\brief Metaheuristics for LEMON library.
516 530

	
517 531
This group contains some metaheuristic optimization tools.
518 532
*/
519 533

	
520 534
/**
521 535
@defgroup utils Tools and Utilities
522 536
\brief Tools and utilities for programming in LEMON
523 537

	
524 538
Tools and utilities for programming in LEMON.
525 539
*/
526 540

	
527 541
/**
528 542
@defgroup gutils Basic Graph Utilities
529 543
@ingroup utils
530 544
\brief Simple basic graph utilities.
531 545

	
532 546
This group contains some simple basic graph utilities.
533 547
*/
534 548

	
535 549
/**
536 550
@defgroup misc Miscellaneous Tools
537 551
@ingroup utils
538 552
\brief Tools for development, debugging and testing.
539 553

	
540 554
This group contains several useful tools for development,
541 555
debugging and testing.
542 556
*/
543 557

	
544 558
/**
545 559
@defgroup timecount Time Measuring and Counting
546 560
@ingroup misc
547 561
\brief Simple tools for measuring the performance of algorithms.
548 562

	
549 563
This group contains simple tools for measuring the performance
550 564
of algorithms.
551 565
*/
552 566

	
553 567
/**
554 568
@defgroup exceptions Exceptions
555 569
@ingroup utils
556 570
\brief Exceptions defined in LEMON.
557 571

	
558 572
This group contains the exceptions defined in LEMON.
559 573
*/
560 574

	
561 575
/**
562 576
@defgroup io_group Input-Output
563 577
\brief Graph Input-Output methods
564 578

	
565 579
This group contains the tools for importing and exporting graphs
566 580
and graph related data. Now it supports the \ref lgf-format
567 581
"LEMON Graph Format", the \c DIMACS format and the encapsulated
568 582
postscript (EPS) format.
569 583
*/
570 584

	
571 585
/**
572 586
@defgroup lemon_io LEMON Graph Format
573 587
@ingroup io_group
574 588
\brief Reading and writing LEMON Graph Format.
575 589

	
576 590
This group contains methods for reading and writing
577 591
\ref lgf-format "LEMON Graph Format".
578 592
*/
579 593

	
580 594
/**
581 595
@defgroup eps_io Postscript Exporting
582 596
@ingroup io_group
583 597
\brief General \c EPS drawer and graph exporter
584 598

	
585 599
This group contains general \c EPS drawing methods and special
586 600
graph exporting tools.
587 601
*/
588 602

	
589 603
/**
590
@defgroup dimacs_group DIMACS format
604
@defgroup dimacs_group DIMACS Format
591 605
@ingroup io_group
592 606
\brief Read and write files in DIMACS format
593 607

	
594 608
Tools to read a digraph from or write it to a file in DIMACS format data.
595 609
*/
596 610

	
597 611
/**
598 612
@defgroup nauty_group NAUTY Format
599 613
@ingroup io_group
600 614
\brief Read \e Nauty format
601 615

	
602 616
Tool to read graphs from \e Nauty format data.
603 617
*/
604 618

	
605 619
/**
606 620
@defgroup concept Concepts
607 621
\brief Skeleton classes and concept checking classes
608 622

	
609 623
This group contains the data/algorithm skeletons and concept checking
610 624
classes implemented in LEMON.
611 625

	
612 626
The purpose of the classes in this group is fourfold.
613 627

	
614 628
- These classes contain the documentations of the %concepts. In order
615 629
  to avoid document multiplications, an implementation of a concept
616 630
  simply refers to the corresponding concept class.
617 631

	
618 632
- These classes declare every functions, <tt>typedef</tt>s etc. an
619 633
  implementation of the %concepts should provide, however completely
620 634
  without implementations and real data structures behind the
621 635
  interface. On the other hand they should provide nothing else. All
622 636
  the algorithms working on a data structure meeting a certain concept
623 637
  should compile with these classes. (Though it will not run properly,
624 638
  of course.) In this way it is easily to check if an algorithm
625 639
  doesn't use any extra feature of a certain implementation.
626 640

	
627 641
- The concept descriptor classes also provide a <em>checker class</em>
628 642
  that makes it possible to check whether a certain implementation of a
629 643
  concept indeed provides all the required features.
630 644

	
631 645
- Finally, They can serve as a skeleton of a new implementation of a concept.
632 646
*/
633 647

	
634 648
/**
635 649
@defgroup graph_concepts Graph Structure Concepts
636 650
@ingroup concept
637 651
\brief Skeleton and concept checking classes for graph structures
638 652

	
639 653
This group contains the skeletons and concept checking classes of LEMON's
640 654
graph structures and helper classes used to implement these.
641 655
*/
642 656

	
643 657
/**
644 658
@defgroup map_concepts Map Concepts
645 659
@ingroup concept
646 660
\brief Skeleton and concept checking classes for maps
647 661

	
648 662
This group contains the skeletons and concept checking classes of maps.
649 663
*/
650 664

	
651 665
/**
666
@defgroup tools Standalone Utility Applications
667

	
668
Some utility applications are listed here.
669

	
670
The standard compilation procedure (<tt>./configure;make</tt>) will compile
671
them, as well.
672
*/
673

	
674
/**
652 675
\anchor demoprograms
653 676

	
654 677
@defgroup demos Demo Programs
655 678

	
656 679
Some demo programs are listed here. Their full source codes can be found in
657 680
the \c demo subdirectory of the source tree.
658 681

	
659 682
In order to compile them, use the <tt>make demo</tt> or the
660 683
<tt>make check</tt> commands.
661 684
*/
662 685

	
663
/**
664
@defgroup tools Standalone Utility Applications
665

	
666
Some utility applications are listed here.
667

	
668
The standard compilation procedure (<tt>./configure;make</tt>) will compile
669
them, as well.
670
*/
671

	
672 686
}
Ignore white space 384 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_DIM2_H
20 20
#define LEMON_DIM2_H
21 21

	
22 22
#include <iostream>
23 23

	
24
///\ingroup misc
24
///\ingroup geomdat
25 25
///\file
26 26
///\brief A simple two dimensional vector and a bounding box implementation
27
///
28
/// The class \ref lemon::dim2::Point "dim2::Point" implements
29
/// a two dimensional vector with the usual operations.
30
///
31
/// The class \ref lemon::dim2::Box "dim2::Box" can be used to determine
32
/// the rectangular bounding box of a set of
33
/// \ref lemon::dim2::Point "dim2::Point"'s.
34 27

	
35 28
namespace lemon {
36 29

	
37 30
  ///Tools for handling two dimensional coordinates
38 31

	
39 32
  ///This namespace is a storage of several
40 33
  ///tools for handling two dimensional coordinates
41 34
  namespace dim2 {
42 35

	
43
  /// \addtogroup misc
36
  /// \addtogroup geomdat
44 37
  /// @{
45 38

	
46 39
  /// Two dimensional vector (plain vector)
47 40

	
48 41
  /// A simple two dimensional vector (plain vector) implementation
49 42
  /// with the usual vector operations.
50 43
  template<typename T>
51 44
    class Point {
52 45

	
53 46
    public:
54 47

	
55 48
      typedef T Value;
56 49

	
57 50
      ///First coordinate
58 51
      T x;
59 52
      ///Second coordinate
60 53
      T y;
61 54

	
62 55
      ///Default constructor
63 56
      Point() {}
64 57

	
65 58
      ///Construct an instance from coordinates
66 59
      Point(T a, T b) : x(a), y(b) { }
67 60

	
68 61
      ///Returns the dimension of the vector (i.e. returns 2).
69 62

	
70 63
      ///The dimension of the vector.
71 64
      ///This function always returns 2.
72 65
      int size() const { return 2; }
73 66

	
74 67
      ///Subscripting operator
75 68

	
76 69
      ///\c p[0] is \c p.x and \c p[1] is \c p.y
77 70
      ///
78 71
      T& operator[](int idx) { return idx == 0 ? x : y; }
79 72

	
80 73
      ///Const subscripting operator
81 74

	
82 75
      ///\c p[0] is \c p.x and \c p[1] is \c p.y
83 76
      ///
84 77
      const T& operator[](int idx) const { return idx == 0 ? x : y; }
85 78

	
86 79
      ///Conversion constructor
87 80
      template<class TT> Point(const Point<TT> &p) : x(p.x), y(p.y) {}
88 81

	
89 82
      ///Give back the square of the norm of the vector
90 83
      T normSquare() const {
91 84
        return x*x+y*y;
92 85
      }
93 86

	
94 87
      ///Increment the left hand side by \c u
95 88
      Point<T>& operator +=(const Point<T>& u) {
96 89
        x += u.x;
97 90
        y += u.y;
98 91
        return *this;
99 92
      }
100 93

	
101 94
      ///Decrement the left hand side by \c u
102 95
      Point<T>& operator -=(const Point<T>& u) {
103 96
        x -= u.x;
104 97
        y -= u.y;
105 98
        return *this;
106 99
      }
107 100

	
108 101
      ///Multiply the left hand side with a scalar
109 102
      Point<T>& operator *=(const T &u) {
110 103
        x *= u;
111 104
        y *= u;
112 105
        return *this;
113 106
      }
114 107

	
115 108
      ///Divide the left hand side by a scalar
116 109
      Point<T>& operator /=(const T &u) {
117 110
        x /= u;
118 111
        y /= u;
119 112
        return *this;
120 113
      }
121 114

	
122 115
      ///Return the scalar product of two vectors
123 116
      T operator *(const Point<T>& u) const {
124 117
        return x*u.x+y*u.y;
125 118
      }
126 119

	
127 120
      ///Return the sum of two vectors
128 121
      Point<T> operator+(const Point<T> &u) const {
129 122
        Point<T> b=*this;
130 123
        return b+=u;
131 124
      }
132 125

	
133 126
      ///Return the negative of the vector
134 127
      Point<T> operator-() const {
135 128
        Point<T> b=*this;
136 129
        b.x=-b.x; b.y=-b.y;
137 130
        return b;
138 131
      }
139 132

	
140 133
      ///Return the difference of two vectors
141 134
      Point<T> operator-(const Point<T> &u) const {
142 135
        Point<T> b=*this;
143 136
        return b-=u;
144 137
      }
145 138

	
146 139
      ///Return a vector multiplied by a scalar
147 140
      Point<T> operator*(const T &u) const {
148 141
        Point<T> b=*this;
149 142
        return b*=u;
150 143
      }
151 144

	
152 145
      ///Return a vector divided by a scalar
153 146
      Point<T> operator/(const T &u) const {
154 147
        Point<T> b=*this;
155 148
        return b/=u;
156 149
      }
157 150

	
158 151
      ///Test equality
159 152
      bool operator==(const Point<T> &u) const {
160 153
        return (x==u.x) && (y==u.y);
161 154
      }
162 155

	
163 156
      ///Test inequality
164 157
      bool operator!=(Point u) const {
165 158
        return  (x!=u.x) || (y!=u.y);
166 159
      }
167 160

	
168 161
    };
169 162

	
170 163
  ///Return a Point
171 164

	
172 165
  ///Return a Point.
173 166
  ///\relates Point
174 167
  template <typename T>
175 168
  inline Point<T> makePoint(const T& x, const T& y) {
176 169
    return Point<T>(x, y);
177 170
  }
178 171

	
179 172
  ///Return a vector multiplied by a scalar
180 173

	
181 174
  ///Return a vector multiplied by a scalar.
182 175
  ///\relates Point
183 176
  template<typename T> Point<T> operator*(const T &u,const Point<T> &x) {
184 177
    return x*u;
185 178
  }
186 179

	
187 180
  ///Read a plain vector from a stream
188 181

	
189 182
  ///Read a plain vector from a stream.
190 183
  ///\relates Point
191 184
  ///
192 185
  template<typename T>
193 186
  inline std::istream& operator>>(std::istream &is, Point<T> &z) {
194 187
    char c;
195 188
    if (is >> c) {
196 189
      if (c != '(') is.putback(c);
197 190
    } else {
198 191
      is.clear();
199 192
    }
200 193
    if (!(is >> z.x)) return is;
201 194
    if (is >> c) {
202 195
      if (c != ',') is.putback(c);
203 196
    } else {
204 197
      is.clear();
205 198
    }
206 199
    if (!(is >> z.y)) return is;
207 200
    if (is >> c) {
208 201
      if (c != ')') is.putback(c);
209 202
    } else {
210 203
      is.clear();
211 204
    }
212 205
    return is;
213 206
  }
214 207

	
215 208
  ///Write a plain vector to a stream
216 209

	
217 210
  ///Write a plain vector to a stream.
218 211
  ///\relates Point
219 212
  ///
220 213
  template<typename T>
221 214
  inline std::ostream& operator<<(std::ostream &os, const Point<T>& z)
222 215
  {
223 216
    os << "(" << z.x << "," << z.y << ")";
224 217
    return os;
225 218
  }
226 219

	
227 220
  ///Rotate by 90 degrees
228 221

	
229 222
  ///Returns the parameter rotated by 90 degrees in positive direction.
230 223
  ///\relates Point
231 224
  ///
232 225
  template<typename T>
233 226
  inline Point<T> rot90(const Point<T> &z)
234 227
  {
235 228
    return Point<T>(-z.y,z.x);
0 comments (0 inline)