@@ -489,18 +489,20 @@ class Diam2KplexEnumeration
489489 using NodeCallback =
490490 typename Enumerable<Diam2KplexNode<Graph>,
491491 Kplex<typename Graph::node_t >>::NodeCallback;
492+
492493 explicit Diam2KplexEnumeration (Graph* graph, size_t k, size_t q,
493494 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.reserve (degen.size ());
499+ for (int i = 0 ; i < degen.size (); i++) {
500+ inverse_perm[i] = degen[i];
501+ }
502+ graph_ = graph->Permute (degen);
497503#else
498- graph->Permute (DegeneracyOrder(*graph))
504+ graph_ = graph->Clone ();
499505#endif
500- ),
501- k_(k),
502- q_(q),
503- enable_pivoting_(enable_pivoting) {
504506 }
505507
506508 void SetUp () override {}
@@ -510,7 +512,16 @@ class Diam2KplexEnumeration
510512 size_t MaxRoots () override { return graph_->size (); }
511513
512514 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
513523 return ((const Diam2KplexEnumeration*)this )->NodeToItem (node);
524+ #endif
514525 }
515526
516527 Kplex<node_t > NodeToItem (const Diam2KplexNode<Graph>& node) const {
@@ -537,25 +548,25 @@ class Diam2KplexEnumeration
537548 subgraph_added[v] = true ;
538549 node.AddToSubgraph (v);
539550 std::vector<node_t > sg;
540- for (node_t n: graph_->fwd_neighs (v)) {
551+ for (node_t n : graph_->fwd_neighs (v)) {
541552 sg.push_back (n);
542553 subgraph_added[n] = true ;
543554 }
544555 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++;
552561 }
553- return filtered;
562+ if (count + 2 * k_ >= q_) filtered.push_back (sg[i]);
563+ }
564+ return filtered;
554565 };
555566 size_t sz;
556567 do {
557- sz = sg.size ();
558- sg = filter_sg (sg);
568+ sz = sg.size ();
569+ sg = filter_sg (sg);
559570 } while (sg.size () != sz);
560571 for (node_t n : sg) {
561572 node.AddToSubgraph (n);
@@ -580,7 +591,7 @@ class Diam2KplexEnumeration
580591 subgraph_candidates.clear ();
581592 }
582593 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 ;
584595 node.Init (graph_.get (), k_);
585596 cb (node);
586597 }
@@ -597,6 +608,9 @@ class Diam2KplexEnumeration
597608 const size_t k_;
598609 const size_t q_;
599610 const bool enable_pivoting_;
611+ #ifdef DEGENERACY
612+ std::vector<node_t > inverse_perm;
613+ #endif
600614};
601615
602616extern template class Diam2KplexEnumeration <fast_graph_t <uint32_t , void >>;
0 commit comments