aGrUM 2.3.2
a C++ library for (probabilistic) graphical models
structuralConstraintNoParentNodes_inl.h
Go to the documentation of this file.
1/****************************************************************************
2 * This file is part of the aGrUM/pyAgrum library. *
3 * *
4 * Copyright (c) 2005-2025 by *
5 * - Pierre-Henri WUILLEMIN(_at_LIP6) *
6 * - Christophe GONZALES(_at_AMU) *
7 * *
8 * The aGrUM/pyAgrum library is free software; you can redistribute it *
9 * and/or modify it under the terms of either : *
10 * *
11 * - the GNU Lesser General Public License as published by *
12 * the Free Software Foundation, either version 3 of the License, *
13 * or (at your option) any later version, *
14 * - the MIT license (MIT), *
15 * - or both in dual license, as here. *
16 * *
17 * (see https://agrum.gitlab.io/articles/dual-licenses-lgplv3mit.html) *
18 * *
19 * This aGrUM/pyAgrum library is distributed in the hope that it will be *
20 * useful, but WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, *
21 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES MERCHANTABILITY or FITNESS *
22 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
25 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
26 * OTHER DEALINGS IN THE SOFTWARE. *
27 * *
28 * See LICENCES for more details. *
29 * *
30 * SPDX-FileCopyrightText: Copyright 2005-2025 *
31 * - Pierre-Henri WUILLEMIN(_at_LIP6) *
32 * - Christophe GONZALES(_at_AMU) *
33 * SPDX-License-Identifier: LGPL-3.0-or-later OR MIT *
34 * *
35 * Contact : info_at_agrum_dot_org *
36 * homepage : http://agrum.gitlab.io *
37 * gitlab : https://gitlab.com/agrumery/agrum *
38 * *
39 ****************************************************************************/
40#pragma once
41
42
44
51#ifndef DOXYGEN_SHOULD_SKIP_THIS
52
53
54namespace gum::learning {
55
57 INLINE void StructuralConstraintNoParentNodes::setGraphAlone(const DiGraph& graph) {}
58
61 return !_noParentNodes_.exists(y);
62 }
63
66 return true;
67 }
68
71 return !_noParentNodes_.exists(x);
72 }
73
75 INLINE bool
77 return checkArcAdditionAlone(change.node1(), change.node2());
78 }
79
81 INLINE bool
83 return checkArcDeletionAlone(change.node1(), change.node2());
84 }
85
87 INLINE bool
89 return checkArcReversalAlone(change.node1(), change.node2());
90 }
91
93 INLINE bool
95 switch (change.type()) {
97 return checkArcAdditionAlone(change.node1(), change.node2());
98
100 return checkArcDeletionAlone(change.node1(), change.node2());
101
103 return checkArcReversalAlone(change.node1(), change.node2());
104
105 default :
106 GUM_ERROR(OperationNotAllowed,
107 "edge modifications are not "
108 "supported by StructuralConstraintNoParentNodes");
109 }
110 }
111
114
117
120
123
125 INLINE bool
127 switch (change.type()) {
129 return !checkArcAdditionAlone(change.node1(), change.node2());
130
132 return checkArcDeletionAlone(change.node1(), change.node2());
133
135 return !checkArcAdditionAlone(change.node2(), change.node1());
136
137 default :
138 GUM_ERROR(OperationNotAllowed,
139 "edge modifications are not supported "
140 "by StructuralConstraintNoParentNodes");
141 }
142 }
143
146 _noParentNodes_ = set;
147 }
148
151 _noParentNodes_.insert(node);
152 }
153
156 _noParentNodes_.erase(node);
157 }
158
161
162// include all the methods applicable to the whole class hierarchy
163# define GUM_CONSTRAINT_CLASS_NAME StructuralConstraintNoParentNodes
165# undef GUM_CONSTRAINT_CLASS_NAME
166
167} // namespace gum::learning
168
169
170#endif /* DOXYGEN_SHOULD_SKIP_THIS */
The class for notifying learning algorithms of new arc additions.
The class for notifying learning algorithms of arc removals.
The class for notifying learning algorithms of arc reversals.
NodeSet _noParentNodes_
the ForbiddenArcs on which we perform checks
bool checkArcDeletionAlone(NodeId x, NodeId y) const
checks whether the constraints enable to remove arc (x,y)
bool checkModificationAlone(const GraphChange &change) const
checks whether the constraints enable to perform a graph change
void modifyGraphAlone(const ArcAddition &change)
notify the constraint of a modification of the graph
const NodeSet & nodes() const
returns the set of nodes without parent
void setNodes(const NodeSet &set)
assign a set of nodes without parent
bool isAlwaysInvalidAlone(const GraphChange &change) const
indicates whether a change will always violate the constraint
void addNode(NodeId node)
assign a new node without parent
void setGraphAlone(const DiGraph &graph)
sets a new graph from which we will perform checkings
bool checkArcReversalAlone(NodeId x, NodeId y) const
checks whether the constraints enable to reverse arc (x,y)
void eraseNode(NodeId node)
remove a node without parent
bool checkArcAdditionAlone(NodeId x, NodeId y) const
checks whether the constraints enable to add arc (x,y)
#define GUM_ERROR(type, msg)
Definition exceptions.h:72
Size NodeId
Type for node ids.
Set< NodeId > NodeSet
Some typdefs and define for shortcuts ...
include the inlined functions if necessary
Definition CSVParser.h:54
the structural constraint for forbidding parents for some nodes during structure learning