Base BGL topology
=================
.. versionadded:: 2.11
*#include *
.. cpp:namespace-push:: pagmo
.. cpp:class:: base_bgl_topology
This class provides the basic building blocks to implement
user-defined topologies (UDTs) based on the Boost Graph Library (BGL).
Note that, by itself, this class does **not** satisfy all the requirements
of a UDT. Specifically, this class is missing the mandatory ``push_back()`` member function,
which has to be implemented in a derived class (see :cpp:class:`~pagmo::is_udt` for the
full list of requirements a UDT must satisfy).
This class provides a strong thread safety guarantee: any member function can be invoked
concurrently with any other member function.
.. seealso::
https://www.boost.org/doc/libs/1_70_0/libs/graph/doc/index.html
.. cpp:function:: base_bgl_topology()
Default constructor.
The default constructor will initialize an empty graph with no vertices and no edges.
.. cpp:function:: base_bgl_topology(const base_bgl_topology &)
.. cpp:function:: base_bgl_topology(base_bgl_topology &&) noexcept
.. cpp:function:: base_bgl_topology &operator=(const base_bgl_topology &)
.. cpp:function:: base_bgl_topology &operator=(base_bgl_topology &&) noexcept
:cpp:class:`~pagmo::base_bgl_topology` is copy/move constructible, and copy/move assignable.
Copy construction/assignment will perform deep copies, move operations will leave the moved-from object in
an unspecified but valid state.
:exception unspecified: when performing copy operations, any exception raised by the copy of the underlying graph object.
.. cpp:function:: std::size_t num_vertices() const
:return: the number of vertices in the topology.
.. cpp:function:: bool are_adjacent(std::size_t i, std::size_t j) const
Check if two vertices are adjacent.
Two vertices *i* and *j* are adjacent if there is a directed edge connecting *i* to *j*.
:param i: the first vertex index.
:param j: the second vertex index.
:return: ``true`` if *i* and *j* are adjacent, ``false`` otherwise.
:exception std\:\:invalid_argument: if *i* or *j* are not smaller than the number of vertices.
:exception unspecified: any exception thrown by the public BGL API.
.. cpp:function:: std::pair, vector_double> get_connections(std::size_t i) const
Fetch the edges connecting to *i*.
This function will return a pair of vectors of equal size, containing:
* the list of all vertices connecting to *i*,
* the weights of the edges.
:param i: the vertex index.
:return: the list of connections to *i*.
:exception std\:\:invalid_argument: if *i* is not smaller than the number of vertices.
:exception unspecified: any exception thrown by the public BGL API.
.. cpp:function:: double get_edge_weight(std::size_t i, std::size_t j) const
.. versionadded:: 2.15
Fetch the weight of the edge connecting *i* to *j*.
:param i: the source vertex index.
:param j: the destination vertex index.
:return: the weight of the edge connecting *i* to *j*.
:exception std\:\:invalid_argument: if either:
* *i* or *j* are not smaller than the number of vertices,
* *i* and *j* are not adjacent.
:exception unspecified: any exception thrown by the public BGL API.
.. cpp:function:: void add_vertex()
Add a vertex.
This function will add a new vertex to the topology. The newly-added vertex
will be disjoint from any other vertex in the topology (i.e., there are no
connections to/from the new vertex).
:exception unspecified: any exception thrown by the public BGL API.
.. cpp:function:: void add_edge(std::size_t i, std::size_t j, double w = 1)
Add a new edge.
This function will add a new edge of weight *w* connecting *i* to *j*.
:param i: the first vertex index.
:param j: the second vertex index.
:param w: the edge's weight.
:exception std\:\:invalid_argument: if either:
* *i* or *j* are not smaller than the number of vertices,
* *i* and *j* are already adjacent,
* *w* is not in the :math:`\left[0, 1\right]` range.
:exception unspecified: any exception thrown by the public BGL API.
.. cpp:function:: void remove_edge(std::size_t i, std::size_t j)
Remove an existing edge.
This function will remove the edge connecting *i* to *j*.
:param i: the first vertex index.
:param j: the second vertex index.
:exception std\:\:invalid_argument: if either:
* *i* or *j* are not smaller than the number of vertices,
* *i* and *j* are not adjacent.
:exception unspecified: any exception thrown by the public BGL API.
.. cpp:function:: void set_weight(std::size_t i, std::size_t j, double w)
Set the weight of an edge.
This function will set to *w* the weight of the edge connecting *i* to *j*.
:param i: the first vertex index.
:param j: the second vertex index.
:param w: the desired weight.
:exception std\:\:invalid_argument: if either:
* *i* or *j* are not smaller than the number of vertices,
* *i* and *j* are not adjacent,
* *w* is not in the :math:`\left[0, 1\right]` range.
:exception unspecified: any exception thrown by the public BGL API.
.. cpp:function:: void set_all_weights(double w)
This function will set the weights of all edges in the topology to *w*.
:param w: the edges' weight.
:exception std\:\:invalid_argument: if *w* is not in the :math:`\left[0, 1\right]` range.
:exception unspecified: any exception thrown by the public BGL API.
.. cpp:function:: std::string get_extra_info() const
:return: a string containing human-readable information about the topology.
:exception unspecified: any exception thrown by the public BGL API.
.. cpp:function:: bgl_graph_t to_bgl() const
.. versionadded:: 2.15
Convert to a BGL graph.
:return: a copy of the internal graph object used to represent the topology.
:exception unspecified: any exception thrown by the public BGL API.
.. cpp:namespace-pop::