51#ifndef DOXYGEN_SHOULD_SKIP_THIS
58 template <
typename STRUCT_CONSTRAINT >
60 STRUCT_CONSTRAINT& constraint) : constraint_(&constraint) {
61 GUM_CONSTRUCTOR(GraphChangesGenerator4DiGraph);
65 template <
typename STRUCT_CONSTRAINT >
66 GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::GraphChangesGenerator4DiGraph(
67 const GraphChangesGenerator4DiGraph& 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(GraphChangesGenerator4DiGraph);
74 template <
typename STRUCT_CONSTRAINT >
75 GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::GraphChangesGenerator4DiGraph(
76 GraphChangesGenerator4DiGraph&& 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(GraphChangesGenerator4DiGraph);
84 template <
typename STRUCT_CONSTRAINT >
85 GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::~GraphChangesGenerator4DiGraph() {
86 GUM_DESTRUCTOR(GraphChangesGenerator4DiGraph);
90 template <
typename STRUCT_CONSTRAINT >
91 GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >&
92 GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::operator=(
93 const GraphChangesGenerator4DiGraph< 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 GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >&
106 GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::operator=(
107 GraphChangesGenerator4DiGraph< 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 GraphChangesGenerator4DiGraph< 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 ArcAddition arc_add(node1, node2);
137 if (!this->constraint_->isAlwaysInvalid(arc_add)) {
138 legal_changes[this_thread].insert(std::move(arc_add));
142 ArcDeletion arc_del(node1, node2);
143 if (!this->constraint_->isAlwaysInvalid(arc_del)) {
144 legal_changes[this_thread].insert(std::move(arc_del));
148 ArcReversal arc_rev(node1, node2);
149 if (!this->constraint_->isAlwaysInvalid(arc_rev)) {
150 legal_changes[this_thread].insert(std::move(arc_rev));
161 ThreadExecutor::execute(nb_threads, threadedLegalSet);
166 for (
const auto& changes: legal_changes) {
167 for (
const auto& change: changes) {
168 legal_changes_.insert(std::move(change));
174 template <
typename STRUCT_CONSTRAINT >
175 void GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::setGraph(
const DiGraph& graph) {
184 template <
typename STRUCT_CONSTRAINT >
185 void GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::clearChanges() noexcept {
186 legal_changes_.clear();
190 template <
typename STRUCT_CONSTRAINT >
191 typename GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::iterator
192 GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::begin()
const {
193 return legal_changes_.cbegin();
197 template <
typename STRUCT_CONSTRAINT >
198 const typename GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::iterator&
199 GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::end()
const {
200 return legal_changes_.cend();
204 template <
typename STRUCT_CONSTRAINT >
206 GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::modifyGraph(
const ArcAddition& change) {
210 template <
typename STRUCT_CONSTRAINT >
212 GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::modifyGraph(
const ArcDeletion& change) {
216 template <
typename STRUCT_CONSTRAINT >
218 GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::modifyGraph(
const ArcReversal& change) {
222 template <
typename STRUCT_CONSTRAINT >
224 GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::modifyGraph(
const GraphChange& change) {
228 template <
typename STRUCT_CONSTRAINT >
229 void GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::notifyGetCompleted() {
230 if (legal_changes_.size()) legal_changes_.clear();
234 template <
typename STRUCT_CONSTRAINT >
235 void GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::setMaxNbThreads(Size nb)
noexcept {
237 _max_threads_number_ = nb;
241 template <
typename STRUCT_CONSTRAINT >
243 GraphChangesGenerator4DiGraph< STRUCT_CONSTRAINT >::constraint() const noexcept {
GraphChangesGenerator4DiGraph(STRUCT_CONSTRAINT &constraint)
default constructor
The basic class for computing the set of digraph changes allowed by the user to be executed by the le...
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