@@ -489,18 +489,20 @@ class Diam2KplexEnumeration
489
489
using NodeCallback =
490
490
typename Enumerable<Diam2KplexNode<Graph>,
491
491
Kplex<typename Graph::node_t >>::NodeCallback;
492
+
492
493
explicit Diam2KplexEnumeration (Graph* graph, size_t k, size_t q,
493
494
bool enable_pivoting)
494
- : graph_(
495
- #ifndef DEGENERACY
496
- graph->Clone ()
495
+ : graph_(), k_(k), q_(q), enable_pivoting_(enable_pivoting) {
496
+ #ifdef DEGENERACY
497
+ auto degen = DegeneracyOrder (*graph);
498
+ inverse_perm = degen;
499
+ for (int i = 0 ; i < degen.size (); i++) {
500
+ inverse_perm[i] = degen[i];
501
+ }
502
+ graph_ = graph->Permute (degen);
497
503
#else
498
- graph->Permute (DegeneracyOrder(*graph))
504
+ graph_ = graph->Clone ();
499
505
#endif
500
- ),
501
- k_(k),
502
- q_(q),
503
- enable_pivoting_(enable_pivoting) {
504
506
}
505
507
506
508
void SetUp () override {}
@@ -510,7 +512,16 @@ class Diam2KplexEnumeration
510
512
size_t MaxRoots () override { return graph_->size (); }
511
513
512
514
Kplex<node_t > NodeToItem (const Diam2KplexNode<Graph>& node) override {
515
+ #ifdef DEGENERACY
516
+ auto kp = ((const Diam2KplexEnumeration*)this )->NodeToItem (node);
517
+ Kplex<node_t > inv_permuted (kp.size ());
518
+ for (int i = 0 ; i < kp.size (); i++) {
519
+ inv_permuted[i] = inverse_perm[kp[i]];
520
+ }
521
+ return inv_permuted;
522
+ #else
513
523
return ((const Diam2KplexEnumeration*)this )->NodeToItem (node);
524
+ #endif
514
525
}
515
526
516
527
Kplex<node_t > NodeToItem (const Diam2KplexNode<Graph>& node) const {
@@ -537,25 +548,25 @@ class Diam2KplexEnumeration
537
548
subgraph_added[v] = true ;
538
549
node.AddToSubgraph (v);
539
550
std::vector<node_t > sg;
540
- for (node_t n: graph_->fwd_neighs (v)) {
551
+ for (node_t n : graph_->fwd_neighs (v)) {
541
552
sg.push_back (n);
542
553
subgraph_added[n] = true ;
543
554
}
544
555
auto filter_sg = [&](const std::vector<node_t >& sg) {
545
- std::vector<node_t > filtered;
546
- for (size_t i=0 ; i<sg.size (); i++) {
547
- size_t count = 0 ;
548
- for (size_t j=0 ; j<sg.size (); j++) {
549
- if (graph_->are_neighs (sg[i], sg[j]))count++;
550
- }
551
- if (count +2 *k_>= q_) filtered.push_back (sg[i]);
556
+ std::vector<node_t > filtered;
557
+ for (size_t i = 0 ; i < sg.size (); i++) {
558
+ size_t count = 0 ;
559
+ for (size_t j = 0 ; j < sg.size (); j++) {
560
+ if (graph_->are_neighs (sg[i], sg[j])) count++;
552
561
}
553
- return filtered;
562
+ if (count + 2 * k_ >= q_) filtered.push_back (sg[i]);
563
+ }
564
+ return filtered;
554
565
};
555
566
size_t sz;
556
567
do {
557
- sz = sg.size ();
558
- sg = filter_sg (sg);
568
+ sz = sg.size ();
569
+ sg = filter_sg (sg);
559
570
} while (sg.size () != sz);
560
571
for (node_t n : sg) {
561
572
node.AddToSubgraph (n);
@@ -580,7 +591,7 @@ class Diam2KplexEnumeration
580
591
subgraph_candidates.clear ();
581
592
}
582
593
for (node_t n : node.Subgraph ()) subgraph_added[n] = false ;
583
- for (node_t n: graph_->fwd_neighs (v)) subgraph_added[n] = false ;
594
+ for (node_t n : graph_->fwd_neighs (v)) subgraph_added[n] = false ;
584
595
node.Init (graph_.get (), k_);
585
596
cb (node);
586
597
}
@@ -597,6 +608,9 @@ class Diam2KplexEnumeration
597
608
const size_t k_;
598
609
const size_t q_;
599
610
const bool enable_pivoting_;
611
+ #ifdef DEGENERACY
612
+ std::vector<node_t > inverse_perm;
613
+ #endif
600
614
};
601
615
602
616
extern template class Diam2KplexEnumeration <fast_graph_t <uint32_t , void >>;
0 commit comments