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) {
140 if (!this->constraint_->isAlwaysInvalid(arc_add)) {
141 legal_changes[this_thread].insert(std::move(arc_add));
146 if (!this->constraint_->isAlwaysInvalid(arc_del)) {
147 legal_changes[this_thread].insert(std::move(arc_del));
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
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