51#ifndef DOXYGEN_SHOULD_SKIP_THIS
58 template <
typename STRUCT_CONSTRAINT >
60 STRUCT_CONSTRAINT& constraint) : constraint_(&constraint) {
61 GUM_CONSTRUCTOR(GraphChangesGenerator4UndiGraph);
65 template <
typename STRUCT_CONSTRAINT >
66 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::GraphChangesGenerator4UndiGraph(
67 const GraphChangesGenerator4UndiGraph& from) :
68 graph_(from.graph_), constraint_(from.constraint_), legal_changes_(from.legal_changes_),
69 _max_threads_number_(from._max_threads_number_) {
70 GUM_CONS_CPY(GraphChangesGenerator4UndiGraph);
74 template <
typename STRUCT_CONSTRAINT >
75 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::GraphChangesGenerator4UndiGraph(
76 GraphChangesGenerator4UndiGraph&& from) :
77 graph_(
std::move(from.graph_)), constraint_(from.constraint_),
78 legal_changes_(
std::move(from.legal_changes_)),
79 _max_threads_number_(from._max_threads_number_) {
80 GUM_CONS_MOV(GraphChangesGenerator4UndiGraph);
84 template <
typename STRUCT_CONSTRAINT >
85 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::~GraphChangesGenerator4UndiGraph() {
86 GUM_DESTRUCTOR(GraphChangesGenerator4UndiGraph);
90 template <
typename STRUCT_CONSTRAINT >
91 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >&
92 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::operator=(
93 const GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >& from) {
96 constraint_ = from.constraint_;
97 legal_changes_ = from.legal_changes_;
98 _max_threads_number_ = from._max_threads_number_;
104 template <
typename STRUCT_CONSTRAINT >
105 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >&
106 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::operator=(
107 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >&& from) {
109 graph_ = std::move(from.graph_);
110 constraint_ = std::move(from.constraint_);
111 legal_changes_ = std::move(from.legal_changes_);
112 _max_threads_number_ = from._max_threads_number_;
118 template <
typename STRUCT_CONSTRAINT >
119 void GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::createChanges_() {
120 legal_changes_.clear();
124 const Size nb_threads = _max_threads_number_;
125 std::vector< Set< GraphChange > > legal_changes(nb_threads);
128 auto threadedLegalSet = [
this, &legal_changes](
const std::size_t this_thread,
129 const std::size_t nb_threads) ->
void {
131 for (
const auto node1: this->graph_) {
132 if (i == this_thread) {
133 for (
const auto node2: this->graph_) {
134 if (node1 != node2) {
137 if (!this->constraint_->isAlwaysInvalid(edge_add)) {
138 legal_changes[this_thread].insert(std::move(edge_add));
143 if (!this->constraint_->isAlwaysInvalid(edge_del)) {
144 legal_changes[this_thread].insert(std::move(edge_del));
155 ThreadExecutor::execute(nb_threads, threadedLegalSet);
160 for (
const auto& changes: legal_changes) {
161 for (
const auto& change: changes) {
162 legal_changes_.insert(std::move(change));
168 template <
typename STRUCT_CONSTRAINT >
169 void GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::setGraph(
const UndiGraph& graph) {
178 template <
typename STRUCT_CONSTRAINT >
179 void GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::clearChanges() noexcept {
180 legal_changes_.clear();
184 template <
typename STRUCT_CONSTRAINT >
185 typename GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::iterator
186 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::begin()
const {
187 return legal_changes_.cbegin();
191 template <
typename STRUCT_CONSTRAINT >
192 const typename GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::iterator&
193 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::end()
const {
194 return legal_changes_.cend();
198 template <
typename STRUCT_CONSTRAINT >
199 void GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::modifyGraph(
200 const EdgeAddition& change) {}
203 template <
typename STRUCT_CONSTRAINT >
204 void GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::modifyGraph(
205 const EdgeDeletion& change) {}
208 template <
typename STRUCT_CONSTRAINT >
209 void GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::modifyGraph(
210 const GraphChange& change) {}
213 template <
typename STRUCT_CONSTRAINT >
214 void GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::notifyGetCompleted() {
215 if (legal_changes_.size()) legal_changes_.clear();
219 template <
typename STRUCT_CONSTRAINT >
220 void GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::setMaxNbThreads(Size nb)
noexcept {
222 _max_threads_number_ = nb;
226 template <
typename STRUCT_CONSTRAINT >
228 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::constraint() const noexcept {
GraphChangesGenerator4UndiGraph(STRUCT_CONSTRAINT &constraint)
default constructor
The basic class for computing the set of undigraph changes allowed by the user to be executed by the ...
include the inlined functions if necessary
class GUM_PUBLIC_BN EdgeDeletion
class GUM_PUBLIC_BN EdgeAddition
gum is the global namespace for all aGrUM entities
unsigned int getNumberOfThreads()
returns the max number of threads used by default when entering the next parallel region