gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Add a resize() function to HypercubeGraph (#311) just like the similar functions in other static graph structures, and extend the test files to check these functions.
0 3 0
default
3 files changed with 38 insertions and 1 deletions:
↑ Collapse diff ↑
Ignore white space 48 line context
... ...
@@ -266,67 +266,83 @@
266 266
      return node._id;
267 267
    }
268 268

	
269 269
    Node operator()(int ix) const {
270 270
      return Node(ix);
271 271
    }
272 272

	
273 273
  private:
274 274
    int _dim;
275 275
    int _node_num, _edge_num;
276 276
  };
277 277

	
278 278

	
279 279
  typedef GraphExtender<HypercubeGraphBase> ExtendedHypercubeGraphBase;
280 280

	
281 281
  /// \ingroup graphs
282 282
  ///
283 283
  /// \brief Hypercube graph class
284 284
  ///
285 285
  /// HypercubeGraph implements a special graph type. The nodes of the
286 286
  /// graph are indexed with integers having at most \c dim binary digits.
287 287
  /// Two nodes are connected in the graph if and only if their indices
288 288
  /// differ only on one position in the binary form.
289 289
  /// This class is completely static and it needs constant memory space.
290
  /// Thus you can neither add nor delete nodes or edges.
290
  /// Thus you can neither add nor delete nodes or edges, however 
291
  /// the structure can be resized using resize().
291 292
  ///
292 293
  /// This type fully conforms to the \ref concepts::Graph "Graph concept".
293 294
  /// Most of its member functions and nested classes are documented
294 295
  /// only in the concept class.
295 296
  ///
296 297
  /// \note The type of the indices is chosen to \c int for efficiency
297 298
  /// reasons. Thus the maximum dimension of this implementation is 26
298 299
  /// (assuming that the size of \c int is 32 bit).
299 300
  class HypercubeGraph : public ExtendedHypercubeGraphBase {
300 301
    typedef ExtendedHypercubeGraphBase Parent;
301 302

	
302 303
  public:
303 304

	
304 305
    /// \brief Constructs a hypercube graph with \c dim dimensions.
305 306
    ///
306 307
    /// Constructs a hypercube graph with \c dim dimensions.
307 308
    HypercubeGraph(int dim) { construct(dim); }
308 309

	
310
    /// \brief Resizes the graph
311
    ///
312
    /// This function resizes the graph. It fully destroys and
313
    /// rebuilds the structure, therefore the maps of the graph will be
314
    /// reallocated automatically and the previous values will be lost.
315
    void resize(int dim) {
316
      Parent::notifier(Arc()).clear();
317
      Parent::notifier(Edge()).clear();
318
      Parent::notifier(Node()).clear();
319
      construct(dim);
320
      Parent::notifier(Node()).build();
321
      Parent::notifier(Edge()).build();
322
      Parent::notifier(Arc()).build();
323
    }
324

	
309 325
    /// \brief The number of dimensions.
310 326
    ///
311 327
    /// Gives back the number of dimensions.
312 328
    int dimension() const {
313 329
      return Parent::dimension();
314 330
    }
315 331

	
316 332
    /// \brief Returns \c true if the n'th bit of the node is one.
317 333
    ///
318 334
    /// Returns \c true if the n'th bit of the node is one.
319 335
    bool projection(Node node, int n) const {
320 336
      return Parent::projection(node, n);
321 337
    }
322 338

	
323 339
    /// \brief The dimension id of an edge.
324 340
    ///
325 341
    /// Gives back the dimension id of the given edge.
326 342
    /// It is in the range <tt>[0..dim-1]</tt>.
327 343
    int dimension(Edge edge) const {
328 344
      return Parent::dimension(edge);
329 345
    }
330 346

	
331 347
    /// \brief The dimension id of an arc.
332 348
    ///
Ignore white space 48 line context
... ...
@@ -357,49 +357,54 @@
357 357
    n3 = g.addNode();
358 358

	
359 359
  Arc
360 360
    e1 = g.addArc(n1, n2),
361 361
    e2 = g.addArc(n2, n3);
362 362

	
363 363
  check(g.valid(n1), "Wrong validity check");
364 364
  check(g.valid(e1), "Wrong validity check");
365 365

	
366 366
  g.erase(n1);
367 367

	
368 368
  check(!g.valid(n1), "Wrong validity check");
369 369
  check(g.valid(n2), "Wrong validity check");
370 370
  check(g.valid(n3), "Wrong validity check");
371 371
  check(!g.valid(e1), "Wrong validity check");
372 372
  check(g.valid(e2), "Wrong validity check");
373 373

	
374 374
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
375 375
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
376 376
}
377 377

	
378 378
void checkFullDigraph(int num) {
379 379
  typedef FullDigraph Digraph;
380 380
  DIGRAPH_TYPEDEFS(Digraph);
381

	
381 382
  Digraph G(num);
383
  check(G.nodeNum() == num && G.arcNum() == num * num, "Wrong size");
384

	
385
  G.resize(num);
386
  check(G.nodeNum() == num && G.arcNum() == num * num, "Wrong size");
382 387

	
383 388
  checkGraphNodeList(G, num);
384 389
  checkGraphArcList(G, num * num);
385 390

	
386 391
  for (NodeIt n(G); n != INVALID; ++n) {
387 392
    checkGraphOutArcList(G, n, num);
388 393
    checkGraphInArcList(G, n, num);
389 394
  }
390 395

	
391 396
  checkGraphConArcList(G, num * num);
392 397

	
393 398
  checkNodeIds(G);
394 399
  checkArcIds(G);
395 400
  checkGraphNodeMap(G);
396 401
  checkGraphArcMap(G);
397 402

	
398 403
  for (int i = 0; i < G.nodeNum(); ++i) {
399 404
    check(G.index(G(i)) == i, "Wrong index");
400 405
  }
401 406

	
402 407
  for (NodeIt s(G); s != INVALID; ++s) {
403 408
    for (NodeIt t(G); t != INVALID; ++t) {
404 409
      Arc a = G.arc(s, t);
405 410
      check(G.source(a) == s && G.target(a) == t, "Wrong arc lookup");
Ignore white space 48 line context
... ...
@@ -249,48 +249,55 @@
249 249
  checkNodeIds(G);
250 250
  checkEdgeIds(G);
251 251
  checkArcIds(G);
252 252
  checkGraphNodeMap(G);
253 253
  checkGraphEdgeMap(G);
254 254
  checkGraphArcMap(G);
255 255

	
256 256
  G.addNode();
257 257
  snapshot.save(G);
258 258

	
259 259
  G.addEdge(G.addNode(), G.addNode());
260 260

	
261 261
  snapshot.restore();
262 262

	
263 263
  checkGraphNodeList(G, 4);
264 264
  checkGraphEdgeList(G, 3);
265 265
  checkGraphArcList(G, 6);
266 266
}
267 267

	
268 268
void checkFullGraph(int num) {
269 269
  typedef FullGraph Graph;
270 270
  GRAPH_TYPEDEFS(Graph);
271 271

	
272 272
  Graph G(num);
273
  check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,
274
        "Wrong size");
275

	
276
  G.resize(num);
277
  check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,
278
        "Wrong size");
279

	
273 280
  checkGraphNodeList(G, num);
274 281
  checkGraphEdgeList(G, num * (num - 1) / 2);
275 282

	
276 283
  for (NodeIt n(G); n != INVALID; ++n) {
277 284
    checkGraphOutArcList(G, n, num - 1);
278 285
    checkGraphInArcList(G, n, num - 1);
279 286
    checkGraphIncEdgeList(G, n, num - 1);
280 287
  }
281 288

	
282 289
  checkGraphConArcList(G, num * (num - 1));
283 290
  checkGraphConEdgeList(G, num * (num - 1) / 2);
284 291

	
285 292
  checkArcDirections(G);
286 293

	
287 294
  checkNodeIds(G);
288 295
  checkArcIds(G);
289 296
  checkEdgeIds(G);
290 297
  checkGraphNodeMap(G);
291 298
  checkGraphArcMap(G);
292 299
  checkGraphEdgeMap(G);
293 300

	
294 301

	
295 302
  for (int i = 0; i < G.nodeNum(); ++i) {
296 303
    check(G.index(G(i)) == i, "Wrong index");
... ...
@@ -393,48 +400,52 @@
393 400
  check(g.valid(e1), "Wrong validity check");
394 401
  check(g.valid(g.direct(e1, true)), "Wrong validity check");
395 402

	
396 403
  g.erase(n1);
397 404

	
398 405
  check(!g.valid(n1), "Wrong validity check");
399 406
  check(g.valid(n2), "Wrong validity check");
400 407
  check(g.valid(n3), "Wrong validity check");
401 408
  check(!g.valid(e1), "Wrong validity check");
402 409
  check(g.valid(e2), "Wrong validity check");
403 410

	
404 411
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
405 412
  check(!g.valid(g.edgeFromId(-1)), "Wrong validity check");
406 413
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
407 414
}
408 415

	
409 416
void checkGridGraph(int width, int height) {
410 417
  typedef GridGraph Graph;
411 418
  GRAPH_TYPEDEFS(Graph);
412 419
  Graph G(width, height);
413 420

	
414 421
  check(G.width() == width, "Wrong column number");
415 422
  check(G.height() == height, "Wrong row number");
416 423

	
424
  G.resize(width, height);
425
  check(G.width() == width, "Wrong column number");
426
  check(G.height() == height, "Wrong row number");
427

	
417 428
  for (int i = 0; i < width; ++i) {
418 429
    for (int j = 0; j < height; ++j) {
419 430
      check(G.col(G(i, j)) == i, "Wrong column");
420 431
      check(G.row(G(i, j)) == j, "Wrong row");
421 432
      check(G.pos(G(i, j)).x == i, "Wrong column");
422 433
      check(G.pos(G(i, j)).y == j, "Wrong row");
423 434
    }
424 435
  }
425 436

	
426 437
  for (int j = 0; j < height; ++j) {
427 438
    for (int i = 0; i < width - 1; ++i) {
428 439
      check(G.source(G.right(G(i, j))) == G(i, j), "Wrong right");
429 440
      check(G.target(G.right(G(i, j))) == G(i + 1, j), "Wrong right");
430 441
    }
431 442
    check(G.right(G(width - 1, j)) == INVALID, "Wrong right");
432 443
  }
433 444

	
434 445
  for (int j = 0; j < height; ++j) {
435 446
    for (int i = 1; i < width; ++i) {
436 447
      check(G.source(G.left(G(i, j))) == G(i, j), "Wrong left");
437 448
      check(G.target(G.left(G(i, j))) == G(i - 1, j), "Wrong left");
438 449
    }
439 450
    check(G.left(G(0, j)) == INVALID, "Wrong left");
440 451
  }
... ...
@@ -468,48 +479,53 @@
468 479

	
469 480
    checkGraphOutArcList(G, n, nb);
470 481
    checkGraphInArcList(G, n, nb);
471 482
    checkGraphIncEdgeList(G, n, nb);
472 483
  }
473 484

	
474 485
  checkArcDirections(G);
475 486

	
476 487
  checkGraphConArcList(G, 2 * (width * (height - 1) + (width - 1) * height));
477 488
  checkGraphConEdgeList(G, width * (height - 1) + (width - 1) * height);
478 489

	
479 490
  checkNodeIds(G);
480 491
  checkArcIds(G);
481 492
  checkEdgeIds(G);
482 493
  checkGraphNodeMap(G);
483 494
  checkGraphArcMap(G);
484 495
  checkGraphEdgeMap(G);
485 496

	
486 497
}
487 498

	
488 499
void checkHypercubeGraph(int dim) {
489 500
  GRAPH_TYPEDEFS(HypercubeGraph);
490 501

	
491 502
  HypercubeGraph G(dim);
503
  check(G.dimension() == dim, "Wrong dimension");
504

	
505
  G.resize(dim);
506
  check(G.dimension() == dim, "Wrong dimension");
507
  
492 508
  checkGraphNodeList(G, 1 << dim);
493 509
  checkGraphEdgeList(G, dim * (1 << (dim-1)));
494 510
  checkGraphArcList(G, dim * (1 << dim));
495 511

	
496 512
  Node n = G.nodeFromId(dim);
497 513

	
498 514
  for (NodeIt n(G); n != INVALID; ++n) {
499 515
    checkGraphIncEdgeList(G, n, dim);
500 516
    for (IncEdgeIt e(G, n); e != INVALID; ++e) {
501 517
      check( (G.u(e) == n &&
502 518
              G.id(G.v(e)) == (G.id(n) ^ (1 << G.dimension(e)))) ||
503 519
             (G.v(e) == n &&
504 520
              G.id(G.u(e)) == (G.id(n) ^ (1 << G.dimension(e)))),
505 521
             "Wrong edge or wrong dimension");
506 522
    }
507 523

	
508 524
    checkGraphOutArcList(G, n, dim);
509 525
    for (OutArcIt a(G, n); a != INVALID; ++a) {
510 526
      check(G.source(a) == n &&
511 527
            G.id(G.target(a)) == (G.id(n) ^ (1 << G.dimension(a))),
512 528
            "Wrong arc or wrong dimension");
513 529
    }
514 530

	
515 531
    checkGraphInArcList(G, n, dim);
0 comments (0 inline)