51#ifndef DOXYGEN_SHOULD_SKIP_THIS
58 template <
typename STRUCT_CONSTRAINT >
60 STRUCT_CONSTRAINT& constraint) : constraint_(&constraint) {
61 GUM_CONSTRUCTOR(GraphChangesGeneratorOnSubDiGraph);
65 template <
typename STRUCT_CONSTRAINT >
66 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::GraphChangesGeneratorOnSubDiGraph(
67 const GraphChangesGeneratorOnSubDiGraph& from) :
68 constraint_(from.constraint_), target_nodes_(from.target_nodes_),
69 tail_nodes_(from.tail_nodes_), legal_changes_(from.legal_changes_),
70 _max_threads_number_(from._max_threads_number_) {
71 GUM_CONS_CPY(GraphChangesGeneratorOnSubDiGraph);
75 template <
typename STRUCT_CONSTRAINT >
76 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::GraphChangesGeneratorOnSubDiGraph(
77 GraphChangesGeneratorOnSubDiGraph&& from) :
78 constraint_(from.constraint_), target_nodes_(
std::move(from.target_nodes_)),
79 tail_nodes_(
std::move(from.tail_nodes_)), legal_changes_(
std::move(from.legal_changes_)),
80 _max_threads_number_(from._max_threads_number_) {
81 GUM_CONS_MOV(GraphChangesGeneratorOnSubDiGraph);
85 template <
typename STRUCT_CONSTRAINT >
86 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::~GraphChangesGeneratorOnSubDiGraph() {
87 GUM_DESTRUCTOR(GraphChangesGeneratorOnSubDiGraph);
91 template <
typename STRUCT_CONSTRAINT >
92 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >&
93 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::operator=(
94 const GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >& from) {
96 constraint_ = from.constraint_;
97 target_nodes_ = from.target_nodes_;
98 tail_nodes_ = from.tail_nodes_;
99 legal_changes_ = from.legal_changes_;
100 _max_threads_number_ = from._max_threads_number_;
106 template <
typename STRUCT_CONSTRAINT >
107 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >&
108 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::operator=(
109 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >&& from) {
111 constraint_ = std::move(from.constraint_);
112 target_nodes_ = std::move(from.target_nodes_);
113 tail_nodes_ = std::move(from.tail_nodes_);
114 legal_changes_ = std::move(from.legal_changes_);
115 _max_threads_number_ = from._max_threads_number_;
121 template <
typename STRUCT_CONSTRAINT >
122 void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::createChanges_() {
123 legal_changes_.clear();
127 const Size nb_threads = _max_threads_number_;
128 std::vector< Set< GraphChange > > legal_changes(nb_threads);
131 auto threadedLegalSet = [
this, &legal_changes](
const std::size_t this_thread,
132 const std::size_t nb_threads) ->
void {
134 for (
const auto node1: this->tail_nodes_) {
135 if (i == this_thread) {
136 for (
const auto node2: this->target_nodes_) {
137 if (node1 != node2) {
139 ArcAddition arc_add(node1, node2);
140 if (!this->constraint_->isAlwaysInvalid(arc_add)) {
141 legal_changes[this_thread].insert(std::move(arc_add));
145 ArcDeletion arc_del(node1, node2);
146 if (!this->constraint_->isAlwaysInvalid(arc_del)) {
147 legal_changes[this_thread].insert(std::move(arc_del));
151 ArcReversal arc_rev(node1, node2);
152 if (!this->constraint_->isAlwaysInvalid(arc_rev)) {
153 legal_changes[this_thread].insert(std::move(arc_rev));
164 ThreadExecutor::execute(nb_threads, threadedLegalSet);
169 for (
const auto& changes: legal_changes) {
170 for (
const auto& change: changes) {
171 legal_changes_.insert(std::move(change));
177 template <
typename STRUCT_CONSTRAINT >
178 void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::setGraph(
const DiGraph& graph) {
184 template <
typename STRUCT_CONSTRAINT >
185 void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::setTargets(
const NodeSet& nodes) {
186 target_nodes_ = nodes;
190 template <
typename STRUCT_CONSTRAINT >
191 void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::addTarget(NodeId node) {
192 target_nodes_.insert(node);
196 template <
typename STRUCT_CONSTRAINT >
197 void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::eraseTarget(NodeId node) {
198 target_nodes_.erase(node);
202 template <
typename STRUCT_CONSTRAINT >
203 void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::setTails(
const NodeSet& nodes) {
208 template <
typename STRUCT_CONSTRAINT >
209 void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::setTails(Size nb_nodes) {
211 for (Idx i = 0; i < nb_nodes; ++i) {
212 tail_nodes_.insert(i);
217 template <
typename STRUCT_CONSTRAINT >
218 void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::addTail(NodeId node) {
219 tail_nodes_.insert(node);
223 template <
typename STRUCT_CONSTRAINT >
224 void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::eraseTail(NodeId node) {
225 tail_nodes_.erase(node);
229 template <
typename STRUCT_CONSTRAINT >
230 void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::clearChanges() noexcept {
231 legal_changes_.clear();
235 template <
typename STRUCT_CONSTRAINT >
236 typename GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::iterator
237 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::begin()
const {
238 return legal_changes_.cbegin();
242 template <
typename STRUCT_CONSTRAINT >
243 const typename GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::iterator&
244 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::end()
const {
245 return legal_changes_.cend();
249 template <
typename STRUCT_CONSTRAINT >
250 void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::modifyGraph(
251 const ArcAddition& change) {}
254 template <
typename STRUCT_CONSTRAINT >
255 void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::modifyGraph(
256 const ArcDeletion& change) {}
259 template <
typename STRUCT_CONSTRAINT >
260 void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::modifyGraph(
261 const ArcReversal& change) {}
264 template <
typename STRUCT_CONSTRAINT >
265 void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::modifyGraph(
266 const GraphChange& change) {}
269 template <
typename STRUCT_CONSTRAINT >
270 void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::notifyGetCompleted() {
271 if (legal_changes_.size()) legal_changes_.clear();
275 template <
typename STRUCT_CONSTRAINT >
276 void GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::setMaxNbThreads(Size nb)
noexcept {
278 _max_threads_number_ = nb;
282 template <
typename STRUCT_CONSTRAINT >
284 GraphChangesGeneratorOnSubDiGraph< STRUCT_CONSTRAINT >::constraint() const noexcept {
GraphChangesGeneratorOnSubDiGraph(STRUCT_CONSTRAINT &constraint)
default constructor
The class for computing the set of graph changes (over a subgraph) transmitted to learning algorithms...
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