49#ifndef DOXYGEN_SHOULD_SKIP_THIS
56 template <
typename STRUCT_CONSTRAINT >
58 STRUCT_CONSTRAINT& constraint) : constraint_(&constraint) {
59 GUM_CONSTRUCTOR(GraphChangesGeneratorOnSubDiGraph);
63 template <
typename STRUCT_CONSTRAINT >
64 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::GraphChangesGeneratorOnSubDiGraph(
65 const GraphChangesGeneratorOnSubDiGraph& from) :
66 constraint_(from.constraint_), target_nodes_(from.target_nodes_),
67 tail_nodes_(from.tail_nodes_), legal_changes_(from.legal_changes_),
68 _max_threads_number_(from._max_threads_number_) {
69 GUM_CONS_CPY(GraphChangesGeneratorOnSubDiGraph);
73 template <
typename STRUCT_CONSTRAINT >
74 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::GraphChangesGeneratorOnSubDiGraph(
75 GraphChangesGeneratorOnSubDiGraph&& from) :
76 constraint_(from.constraint_), target_nodes_(
std::move(from.target_nodes_)),
77 tail_nodes_(
std::move(from.tail_nodes_)), legal_changes_(
std::move(from.legal_changes_)),
78 _max_threads_number_(from._max_threads_number_) {
79 GUM_CONS_MOV(GraphChangesGeneratorOnSubDiGraph);
83 template <
typename STRUCT_CONSTRAINT >
84 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::~GraphChangesGeneratorOnSubDiGraph() {
85 GUM_DESTRUCTOR(GraphChangesGeneratorOnSubDiGraph);
89 template <
typename STRUCT_CONSTRAINT >
90 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >&
91 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::operator=(
92 const GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >& from) {
94 constraint_ = from.constraint_;
95 target_nodes_ = from.target_nodes_;
96 tail_nodes_ = from.tail_nodes_;
97 legal_changes_ = from.legal_changes_;
98 _max_threads_number_ = from._max_threads_number_;
104 template <
typename STRUCT_CONSTRAINT >
105 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >&
106 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::operator=(
107 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >&& from) {
109 constraint_ = std::move(from.constraint_);
110 target_nodes_ = std::move(from.target_nodes_);
111 tail_nodes_ = std::move(from.tail_nodes_);
112 legal_changes_ = std::move(from.legal_changes_);
113 _max_threads_number_ = from._max_threads_number_;
119 template <
typename STRUCT_CONSTRAINT >
120 void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::createChanges_() {
121 legal_changes_.clear();
125 const Size nb_threads = _max_threads_number_;
126 std::vector< Set< GraphChange > > legal_changes(nb_threads);
129 auto threadedLegalSet = [
this, &legal_changes](
const std::size_t this_thread,
130 const std::size_t nb_threads) ->
void {
132 for (
const auto node1: this->tail_nodes_) {
133 if (i == this_thread) {
134 for (
const auto node2: this->target_nodes_) {
135 if (node1 != node2) {
137 ArcAddition arc_add(node1, node2);
138 if (!this->constraint_->isAlwaysInvalid(arc_add)) {
139 legal_changes[this_thread].insert(std::move(arc_add));
143 ArcDeletion arc_del(node1, node2);
144 if (!this->constraint_->isAlwaysInvalid(arc_del)) {
145 legal_changes[this_thread].insert(std::move(arc_del));
149 ArcReversal arc_rev(node1, node2);
150 if (!this->constraint_->isAlwaysInvalid(arc_rev)) {
151 legal_changes[this_thread].insert(std::move(arc_rev));
162 ThreadExecutor::execute(nb_threads, threadedLegalSet);
167 for (
const auto& changes: legal_changes) {
168 for (
const auto& change: changes) {
169 legal_changes_.insert(std::move(change));
175 template <
typename STRUCT_CONSTRAINT >
177 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::setGraph(
const DiGraph& graph) {
183 template <
typename STRUCT_CONSTRAINT >
185 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::setTargets(
const NodeSet& nodes) {
186 target_nodes_ = nodes;
190 template <
typename STRUCT_CONSTRAINT >
191 INLINE
void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::addTarget(NodeId node) {
192 target_nodes_.insert(node);
196 template <
typename STRUCT_CONSTRAINT >
197 INLINE
void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::eraseTarget(NodeId node) {
198 target_nodes_.erase(node);
202 template <
typename STRUCT_CONSTRAINT >
204 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::setTails(
const NodeSet& nodes) {
209 template <
typename STRUCT_CONSTRAINT >
210 INLINE
void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::setTails(Size nb_nodes) {
212 for (Idx i = 0; i < nb_nodes; ++i) {
213 tail_nodes_.insert(i);
218 template <
typename STRUCT_CONSTRAINT >
219 INLINE
void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::addTail(NodeId node) {
220 tail_nodes_.insert(node);
224 template <
typename STRUCT_CONSTRAINT >
225 INLINE
void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::eraseTail(NodeId node) {
226 tail_nodes_.erase(node);
230 template <
typename STRUCT_CONSTRAINT >
231 INLINE
void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::clearChanges() noexcept {
232 legal_changes_.clear();
236 template <
typename STRUCT_CONSTRAINT >
237 INLINE
typename GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::iterator
238 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::begin()
const {
239 return legal_changes_.cbegin();
243 template <
typename STRUCT_CONSTRAINT >
244 INLINE
const typename GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::iterator&
245 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::end()
const {
246 return legal_changes_.cend();
250 template <
typename STRUCT_CONSTRAINT >
251 INLINE
void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::modifyGraph(
252 const ArcAddition& change) {}
255 template <
typename STRUCT_CONSTRAINT >
256 INLINE
void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::modifyGraph(
257 const ArcDeletion& change) {}
260 template <
typename STRUCT_CONSTRAINT >
261 INLINE
void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::modifyGraph(
262 const ArcReversal& change) {}
265 template <
typename STRUCT_CONSTRAINT >
266 INLINE
void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::modifyGraph(
267 const GraphChange& change) {}
270 template <
typename STRUCT_CONSTRAINT >
271 INLINE
void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::notifyGetCompleted() {
272 if (legal_changes_.size()) legal_changes_.clear();
276 template <
typename STRUCT_CONSTRAINT >
278 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::setMaxNbThreads(Size nb)
noexcept {
280 _max_threads_number_ = nb;
284 template <
typename STRUCT_CONSTRAINT >
285 INLINE STRUCT_CONSTRAINT&
286 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::constraint() const noexcept {
GraphChangesGeneratorOnSubDiGraph(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