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) {
136 EdgeAddition edge_add(node1, node2);
137 if (!this->constraint_->isAlwaysInvalid(edge_add)) {
138 legal_changes[this_thread].insert(std::move(edge_add));
142 EdgeDeletion edge_del(node1, node2);
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
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