49#ifndef DOXYGEN_SHOULD_SKIP_THIS
56 template <
typename STRUCT_CONSTRAINT >
58 STRUCT_CONSTRAINT& constraint) : constraint_(&constraint) {
59 GUM_CONSTRUCTOR(GraphChangesGenerator4UndiGraph);
63 template <
typename STRUCT_CONSTRAINT >
64 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::GraphChangesGenerator4UndiGraph(
65 const GraphChangesGenerator4UndiGraph& from) :
66 graph_(from.graph_), constraint_(from.constraint_), legal_changes_(from.legal_changes_),
67 _max_threads_number_(from._max_threads_number_) {
68 GUM_CONS_CPY(GraphChangesGenerator4UndiGraph);
72 template <
typename STRUCT_CONSTRAINT >
73 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::GraphChangesGenerator4UndiGraph(
74 GraphChangesGenerator4UndiGraph&& from) :
75 graph_(
std::move(from.graph_)), constraint_(from.constraint_),
76 legal_changes_(
std::move(from.legal_changes_)),
77 _max_threads_number_(from._max_threads_number_) {
78 GUM_CONS_MOV(GraphChangesGenerator4UndiGraph);
82 template <
typename STRUCT_CONSTRAINT >
83 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::~GraphChangesGenerator4UndiGraph() {
84 GUM_DESTRUCTOR(GraphChangesGenerator4UndiGraph);
88 template <
typename STRUCT_CONSTRAINT >
89 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >&
90 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::operator=(
91 const GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >& from) {
94 constraint_ = from.constraint_;
95 legal_changes_ = from.legal_changes_;
96 _max_threads_number_ = from._max_threads_number_;
102 template <
typename STRUCT_CONSTRAINT >
103 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >&
104 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::operator=(
105 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >&& from) {
107 graph_ = std::move(from.graph_);
108 constraint_ = std::move(from.constraint_);
109 legal_changes_ = std::move(from.legal_changes_);
110 _max_threads_number_ = from._max_threads_number_;
116 template <
typename STRUCT_CONSTRAINT >
117 void GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::createChanges_() {
118 legal_changes_.clear();
122 const Size nb_threads = _max_threads_number_;
123 std::vector< Set< GraphChange > > legal_changes(nb_threads);
126 auto threadedLegalSet = [
this, &legal_changes](
const std::size_t this_thread,
127 const std::size_t nb_threads) ->
void {
129 for (
const auto node1: this->graph_) {
130 if (i == this_thread) {
131 for (
const auto node2: this->graph_) {
132 if (node1 != node2) {
134 EdgeAddition edge_add(node1, node2);
135 if (!this->constraint_->isAlwaysInvalid(edge_add)) {
136 legal_changes[this_thread].insert(std::move(edge_add));
140 EdgeDeletion edge_del(node1, node2);
141 if (!this->constraint_->isAlwaysInvalid(edge_del)) {
142 legal_changes[this_thread].insert(std::move(edge_del));
153 ThreadExecutor::execute(nb_threads, threadedLegalSet);
158 for (
const auto& changes: legal_changes) {
159 for (
const auto& change: changes) {
160 legal_changes_.insert(std::move(change));
166 template <
typename STRUCT_CONSTRAINT >
168 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::setGraph(
const UndiGraph& graph) {
177 template <
typename STRUCT_CONSTRAINT >
178 INLINE
void GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::clearChanges() noexcept {
179 legal_changes_.clear();
183 template <
typename STRUCT_CONSTRAINT >
184 INLINE
typename GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::iterator
185 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::begin()
const {
186 return legal_changes_.cbegin();
190 template <
typename STRUCT_CONSTRAINT >
191 INLINE
const typename GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::iterator&
192 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::end()
const {
193 return legal_changes_.cend();
197 template <
typename STRUCT_CONSTRAINT >
198 INLINE
void GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::modifyGraph(
199 const EdgeAddition& change) {}
202 template <
typename STRUCT_CONSTRAINT >
203 INLINE
void GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::modifyGraph(
204 const EdgeDeletion& change) {}
207 template <
typename STRUCT_CONSTRAINT >
208 INLINE
void GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::modifyGraph(
209 const GraphChange& change) {}
212 template <
typename STRUCT_CONSTRAINT >
213 INLINE
void GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::notifyGetCompleted() {
214 if (legal_changes_.size()) legal_changes_.clear();
218 template <
typename STRUCT_CONSTRAINT >
220 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::setMaxNbThreads(Size nb)
noexcept {
222 _max_threads_number_ = nb;
226 template <
typename STRUCT_CONSTRAINT >
227 INLINE STRUCT_CONSTRAINT&
228 GraphChangesGenerator4UndiGraph< STRUCT_CONSTRAINT >::constraint() const noexcept {
GraphChangesGenerator4UndiGraph(STRUCT_CONSTRAINT &constraint)
default constructor
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