aGrUM 3.0.0
a C++ library for (probabilistic) graphical models
undiGraph_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-2026 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-2026 *
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
41#pragma once
42
43
50
51// to ease parser
56
57namespace gum {
58
59 INLINE void UndiGraph::addEdge(const NodeId first, const NodeId second) {
60 if (!exists(first)) { GUM_ERROR(InvalidNode, "Node (" << first << ") does not exist.") }
61
62 if (!exists(second)) { GUM_ERROR(InvalidNode, "Node (" << second << ") does not exist.") }
63
64 EdgeGraphPart::addEdge(second, first);
65 }
66
71
73 if (this != &g) {
77 GUM_OP_CPY(UndiGraph);
78 }
79
80 return *this;
81 }
82
84 if (this != &g) {
85 NodeGraphPart::operator=(std::move(g));
86 EdgeGraphPart::operator=(std::move(g));
87 GUM_OP_MOV(UndiGraph);
88 }
89 return *this;
90 }
91
92 INLINE void UndiGraph::eraseNode(const NodeId id) {
93 // warning: to remove the edges adjacent to id, use the unvirtualized
94 // versions
95 // of edge removals
98 }
99
100 INLINE bool UndiGraph::operator==(const UndiGraph& p) const {
102 }
103
104 INLINE std::optional< std::vector< NodeId > > UndiGraph::undirectedPath(NodeId node1,
105 NodeId node2) const {
106 return graph::undirectedPath(*this, node1, node2);
107 }
108
109 INLINE bool UndiGraph::hasUndirectedPath(NodeId n1, NodeId n2) const {
110 return graph::hasUndirectedPath(*this, n1, n2);
111 }
112
113 INLINE bool UndiGraph::hasUndirectedPath(NodeId n1, NodeId n2, const NodeSet& except) const {
114 return graph::hasUndirectedPath(*this, n1, n2, except);
115 }
116
118 const NodeSet& n2,
119 const NodeSet& except) const {
120 return graph::hasUndirectedPath(*this, n1, n2, except);
121 }
122
126
130
131 INLINE bool UndiGraph::hasUndirectedCycle() const { return graph::hasUndirectedCycle(*this); }
132
133} /* namespace gum */
void unvirtualizedEraseNeighbours(NodeId id)
same function as eraseNeighbours but without any virtual call to an erase
EdgeGraphPart & operator=(const EdgeGraphPart &s)
copy operator
bool operator==(const EdgeGraphPart &p) const
tests whether two EdgeGraphParts contain the same edges
virtual void addEdge(NodeId n1, NodeId n2)
insert a new edge into the EdgeGraphPart
virtual void clearEdges()
removes all the edges from the EdgeGraphPart
Exception : node does not exist.
virtual void eraseNode(const NodeId id)
erase the node with the given id
NodeGraphPart & operator=(const NodeGraphPart &p)
copy operator
bool exists(const NodeId id) const
alias for existsNode
virtual void clearNodes()
remove all the nodes from the NodeGraphPart
bool operator==(const NodeGraphPart &p) const
check whether two NodeGraphParts contain the same nodes
bool operator==(const UndiGraph &g) const
tests whether two UndiGraphs are identical (same nodes, same edges)
UndiGraph & operator=(const UndiGraph &g)
copy operator
void clear() override
removes all the nodes and edges from the graph
NodeProperty< NodeId > chainComponents() const
returns a property {node:id of chain component} (edges only)
void addEdge(NodeId first, NodeId second) override
insert a new edge into the undirected graph
bool hasUndirectedPath(NodeId n1, NodeId n2) const
returns true if n1 and n2 are connected by an undirected path
bool hasUndirectedCycle() const
checks whether the graph contains cycles
NodeProperty< NodeId > connectedComponents() const
returns a property {node:id of weakly connected component}
std::optional< std::vector< NodeId > > undirectedPath(NodeId node1, NodeId node2) const
returns a shortest undirected path from node1 to node2, or std::nullopt if none
void eraseNode(NodeId id) override
remove a node and its adjacent edges from the graph
UndiGraph(Size nodes_size=HashTableConst::default_size, bool nodes_resize_policy=true, Size edges_size=HashTableConst::default_size, bool edges_resize_policy=true)
default constructor
Definition undiGraph.cpp:73
Generic cycle-detection algorithms for aGrUM graphs.
#define GUM_ERROR(type, msg)
Definition exceptions.h:76
Size NodeId
Type for node ids.
HashTable< NodeId, VAL > NodeProperty
Property on graph elements.
Set< NodeId > NodeSet
Some typdefs and define for shortcuts ...
bool hasUndirectedCycle(const G &g)
Returns true if g contains at least one undirected cycle.
std::optional< std::vector< NodeId > > undirectedPath(const G &g, NodeId n1, NodeId n2)
Shortest undirected path from n1 to n2 (BFS).
NodeProperty< NodeId > chainComponents(const G &g)
Returns a node-to-component-id mapping for the chain components of g (connected components of the edg...
bool hasUndirectedPath(const G &g, NodeId n1, NodeId n2)
Returns true if an undirected path exists between n1 and n2.
NodeProperty< NodeId > connectedComponents(const G &g)
Returns a node-to-component-id mapping for the (weakly) connected components of g.
gum is the global namespace for all aGrUM entities
Definition agrum.h:46
Generic BFS-based path-finding algorithms for aGrUM graphs.
Generic node-reachability algorithms for aGrUM graphs.
Base classes for undirected graphs.