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) {
137 if (!this->constraint_->isAlwaysInvalid(arc_add)) {
138 legal_changes[this_thread].insert(std::move(arc_add));
143 if (!this->constraint_->isAlwaysInvalid(arc_del)) {
144 legal_changes[this_thread].insert(std::move(arc_del));
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
class GUM_PUBLIC_BN ArcReversal
class GUM_PUBLIC_BN ArcDeletion
class GUM_PUBLIC_BN ArcAddition
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