Skip to content

Commit 2fd41b7

Browse files
committed
Fixed nodes printing, Issue #9
1 parent 016153e commit 2fd41b7

File tree

2 files changed

+55
-25
lines changed

2 files changed

+55
-25
lines changed

enumerable/clique.hpp

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,19 @@ class CliqueEnumeration
2424
using node_t = typename Graph::node_t;
2525
using NodeCallback = typename Enumerable<CliqueEnumerationNode<node_t>,
2626
Clique<node_t>>::NodeCallback;
27-
explicit CliqueEnumeration(Graph* graph)
28-
:graph_(
27+
28+
explicit CliqueEnumeration(Graph* graph) : graph_() {
2929
#ifndef DEGENERACY
30-
graph->Clone()
30+
graph_ = graph->Clone();
3131
#else
32-
graph->Permute(DegeneracyOrder(*graph))
32+
auto degen = DegeneracyOrder(*graph);
33+
inverse_perm = degen;
34+
for (int i = 0; i < degen.size(); i++) {
35+
inverse_perm[i] = degen[i];
36+
}
37+
graph_ = graph->Permute(degen);
3338
#endif
34-
){}
39+
}
3540

3641
void SetUp() override {
3742
candidates_bitset_.resize(graph_->size());
@@ -112,7 +117,15 @@ class CliqueEnumeration
112117

113118
Clique<node_t> NodeToItem(
114119
const CliqueEnumerationNode<node_t>& node) override {
120+
#ifdef DEGENERACY
121+
Clique<node_t> inv_permuted(node.first.size());
122+
for (int i = 0; i < node.first.size(); i++) {
123+
inv_permuted[i] = inverse_perm[node.first[i]];
124+
}
125+
return inv_permuted;
126+
#else
115127
return node.first;
128+
#endif
116129
}
117130

118131
private:
@@ -179,6 +192,9 @@ class CliqueEnumeration
179192
static thread_local std::vector<bool> bad_bitset_;
180193
static thread_local std::vector<node_t> bad_;
181194
std::unique_ptr<Graph> graph_;
195+
#ifdef DEGENERACY
196+
std::vector<node_t> inverse_perm;
197+
#endif
182198
};
183199

184200
template <typename Graph>

enumerable/diam2kplex.hpp

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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 = degen;
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

602616
extern template class Diam2KplexEnumeration<fast_graph_t<uint32_t, void>>;

0 commit comments

Comments
 (0)