File: topology.rst

package info (click to toggle)
pagmo 2.19.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 85,228 kB
  • sloc: cpp: 1,753,592; makefile: 223; sh: 121; python: 46
file content (384 lines) | stat: -rw-r--r-- 15,744 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
Topology
========

.. versionadded:: 2.11

*#include <pagmo/topology.hpp>*

.. cpp:namespace-push:: pagmo

.. cpp:class:: topology

   In the jargon of pagmo, a topology is an object that represents connections among
   :cpp:class:`islands <pagmo::island>` in an :cpp:class:`~pagmo::archipelago`.
   In essence, a topology is a *weighted directed graph* in which

   * the *vertices* (or *nodes*) are islands,
   * the *edges* (or *arcs*) are directed connections between islands across which information flows during the
     optimisation process (via the migration of individuals),
   * the *weights* of the edges (whose numerical values are the :math:`[0.,1.]` range) represent the migration
     probability.

   Following the same schema adopted for :cpp:class:`~pagmo::problem`, :cpp:class:`~pagmo::algorithm`, etc.,
   :cpp:class:`~pagmo::topology` exposes a type-erased generic
   interface to *user-defined topologies* (or UDT for short). UDTs are classes providing a certain set
   of member functions that describe the properties of (and allow to interact with) a topology. Once
   defined and instantiated, a UDT can then be used to construct an instance of this class,
   :cpp:class:`~pagmo::topology`, which
   provides a generic interface to topologies for use by :cpp:class:`~pagmo::archipelago`.

   In a :cpp:class:`~pagmo::topology`, vertices in the graph are identified by a zero-based unique
   integral index (represented by a ``std::size_t``). This integral index corresponds to the index of an
   :cpp:class:`~pagmo::island` in an :cpp:class:`~pagmo::archipelago`.

   Every UDT must implement at least the following member functions:

   .. code-block:: c++

      std::pair<std::vector<std::size_t>, vector_double> get_connections(std::size_t) const;
      void push_back();

   The ``get_connections()`` function takes as input a vertex index ``n``, and it is expected to return
   a pair of vectors containing respectively:

   * the indices of the vertices which are connecting to ``n`` (that is, the list of vertices for which a directed edge
     towards ``n`` exists),
   * the weights (i.e., the migration probabilities) of the edges linking the connecting vertices to ``n``.

   The ``push_back()`` member function is expected to add a new vertex to the topology, assigning it the next
   available index and establishing connections to other vertices. The ``push_back()`` member function is invoked
   by :cpp:func:`pagmo::archipelago::push_back()` upon the insertion of a new island into an archipelago,
   and it is meant
   to allow the incremental construction of a topology. That is, after ``N`` calls to ``push_back()``
   on an initially-empty topology, the topology should contain ``N`` vertices and any number of edges (depending
   on the specifics of the topology).

   In addition to providing the above member functions, a UDT must also be default, copy and move constructible.

   Additional optional member functions can be implemented in a UDT:

   .. code-block:: c++

      std::string get_name() const;
      std::string get_extra_info() const;
      bgl_graph_t to_bgl() const;

   See the documentation of the corresponding member functions in this class for details on how the optional
   member functions in the UDT are used by :cpp:class:`~pagmo::topology`.

   Topologies are used in asynchronous operations involving migration in archipelagos,
   and thus they need to provide a certain degree of thread safety. Specifically, the
   ``get_connections()`` member function of the UDT might be invoked concurrently with
   any other member function of the UDT interface (except for the destructor, the move
   constructor, and, if implemented, the deserialisation function). It is up to the
   authors of user-defined topologies to ensure that this safety requirement is satisfied.

   .. warning::

      The only operations allowed on a moved-from :cpp:class:`pagmo::topology` are destruction,
      assignment, and the invocation of the :cpp:func:`~pagmo::topology::is_valid()` member function.
      Any other operation will result in undefined behaviour.

   .. cpp:function:: topology()

      Default constructor.

      The default constructor will initialize a :cpp:class:`~pagmo::topology` containing an
      :cpp:class:`~pagmo::unconnected` topology.

      :exception unspecified: any exception raised by the constructor from a generic UDT.

   .. cpp:function:: topology(const topology &)
   .. cpp:function:: topology(topology &&) noexcept
   .. cpp:function:: topology &operator=(const topology &)
   .. cpp:function:: topology &operator=(topology &&) noexcept

      :cpp:class:`~pagmo::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
      a state which is destructible and assignable.

      :exception unspecified: when performing copy operations, any exception raised by the UDT upon copying, or by memory allocation failures.

   .. cpp:function:: template <typename T> explicit topology(T &&x)

      Generic constructor from a UDT.

      This constructor participates in overload resolution only if ``T``, after the removal of reference
      and cv qualifiers, is not :cpp:class:`~pagmo::topology` and if it satisfies :cpp:class:`pagmo::is_udt`.

      This constructor will construct a :cpp:class:`~pagmo::topology` from the UDT (user-defined topology)
      *x* of type ``T``. The input parameter *x* will be perfectly forwarded to construct the internal UDT instance.

      :param x: the input UDT.

      :exception unspecified: any exception thrown by the public API of the UDT, or by memory allocation failures.

   .. cpp:function:: template <typename T> topology &operator=(T &&x)

      Generic assignment operator from a UDT.

      This operator participates in overload resolution only if ``T``, after the removal of reference
      and cv qualifiers, is not :cpp:class:`~pagmo::topology` and if it satisfies :cpp:class:`pagmo::is_udt`.

      This operator will set the internal UDT to *x* by constructing a :cpp:class:`~pagmo::topology` from *x*,
      and then move-assigning the result to *this*.

      :param x: the input UDT.

      :return: a reference to *this*.

      :exception unspecified: any exception thrown by the generic constructor from a UDT.

   .. cpp:function:: template <typename T> const T *extract() const noexcept
   .. cpp:function:: template <typename T> T *extract() noexcept

      Extract a (const) pointer to the internal UDT instance.

      If ``T`` is the type of the UDT currently stored within this object, then this function
      will return a (const) pointer to the internal UDT instance. Otherwise, ``nullptr`` will be returned.

      The returned value is a raw non-owning pointer: the lifetime of the pointee is tied to the lifetime
      of ``this``, and ``delete`` must never be called on the pointer.

      .. warning::

         The non-const overload of this function is provided only in order to allow to call non-const
         member functions on the internal UDT instance. Assigning a new UDT via pointers obtained
         through this function is undefined behaviour.

      :return: a (const) pointer to the internal UDT instance, or ``nullptr``.

   .. cpp:function:: template <typename T> bool is() const noexcept

      Check the type of the UDT.

      :return: ``true`` if ``T`` is the type of the UDT currently stored within this object, ``false`` otherwise.

   .. cpp:function:: std::pair<std::vector<std::size_t>, vector_double> get_connections(std::size_t n) const

      Get the connections to a vertex.

      This function will invoke the ``get_connections()`` member function of the UDT, which is expected to return
      a pair of vectors containing respectively:

      * the indices of the vertices which are connecting to *n* (that is, the list of vertices for which a directed
        edge towards *n* exists),
      * the weights (i.e., the migration probabilities) of the edges linking the connecting vertices to *n*.

      This function will also run sanity checks on the output of the ``get_connections()`` member function of the UDT.

      :param n: the index of the vertex whose incoming connections' details will be returned.

      :return: a pair of vectors describing *n*'s incoming connections.

      :exception std\:\:invalid_argument: if the sizes of the returned vectors differ, or if any element of the second
        vector is not in the :math:`[0.,1.]` range.
      :exception unspecified: any exception thrown by the ``get_connections()`` member function of the UDT.

   .. cpp:function:: void push_back()

      Add a vertex.

      This member function will invoke the ``push_back()`` member function of the UDT, which is expected to add a new vertex to the
      topology, assigning it the next available index and establishing connections to other vertices.

      :exception unspecified: any exception thrown by the ``push_back()`` member function of the UDT.

   .. cpp:function:: void push_back(unsigned n)

      Add multiple vertices.

      This member function will call :cpp:func:`~pagmo::topology::push_back()` *n* times.

      :param n: the number of times :cpp:func:`~pagmo::topology::push_back()` will be called.

      :exception unspecified: any exception thrown by :cpp:func:`~pagmo::topology::push_back()`.

   .. cpp:function:: bgl_graph_t to_bgl() const

      .. versionadded:: 2.15

      Convert to a Boost graph.

      If the UDT satisfies :cpp:class:`pagmo::has_to_bgl`, then this member function will return
      the output of its ``to_bgl()`` member function. Otherwise, an exception will be raised.

      This function is meant to export a representation of the current state of the topology
      as a :cpp:type:`pagmo::bgl_graph_t` object (that is, as a graph object from the Boost
      Graph Library).

      :return: a representation of ``this`` as a Boost graph object.

      :exception not_implemented_error: if the UDT does not satisfy :cpp:class:`pagmo::has_to_bgl`.
      :exception unspecified: any exception thrown by the ``to_bgl()`` member function of the UDT.

   .. cpp:function:: std::string get_name() const

      Get the name of this topology.

      If the UDT satisfies :cpp:class:`pagmo::has_name`, then this member function will return the output of its ``get_name()`` member function.
      Otherwise, an implementation-defined name based on the type of the UDT will be returned.

      :return: the name of this topology.

      :exception unspecified: any exception thrown by copying an ``std::string`` object.

   .. cpp:function:: std::string get_extra_info() const

      Extra info for this topology.

      If the UDT satisfies :cpp:class:`pagmo::has_extra_info`, then this member function will return the output of its
      ``get_extra_info()`` member function. Otherwise, an empty string will be returned.

      :return: extra info about the UDT.

      :exception unspecified: any exception thrown by the ``get_extra_info()`` member function of the UDT, or by copying an ``std::string`` object.

   .. cpp:function:: bool is_valid() const

      Check if this topology is in a valid state.

      :return: ``false`` if *this* was moved from, ``true`` otherwise.

   .. cpp:function:: std::type_index get_type_index() const

      .. versionadded:: 2.15

      Get the type of the UDT.

      This function will return the type
      of the UDT stored within this :cpp:class:`~pagmo::topology`
      instance.

      :return: the type of the UDT.

   .. cpp:function:: const void *get_ptr() const
   .. cpp:function:: void *get_ptr()

      .. versionadded:: 2.15

      Get a pointer to the UDT.

      These functions will return a raw (const) pointer
      to the internal UDT instance. Differently from
      the :cpp:func:`~pagmo::topology::extract()` overloads, these functions
      do not require to pass the correct type
      in input. It is however the user's responsibility
      to cast the returned void pointer to the correct type.

      .. note::

         The returned value is a raw non-owning pointer: the lifetime of the pointee is tied to the lifetime
         of ``this``, and ``delete`` must never be called on the pointer.

      .. note::

         The ability to extract a mutable pointer is provided only in order to allow to call non-const
         methods on the internal UDT instance. Assigning a new UDT via this pointer is undefined behaviour.

      :return: a pointer to the internal UDT.

Types
-----

.. cpp:type:: bgl_graph_t = boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, boost::no_property, double, boost::no_property, boost::listS>

   .. versionadded:: 2.15

   This type is a ``boost::adjacency_list`` from the Boost Graph Library (BGL),
   and it is used as an export format for user-defined topologies (UDTs).

   Specifically, UDTs can (optionally) implement a ``to_bgl()`` member function
   which will return an object of this type representing the internal state
   of the topology as a weighted directed graph.

   .. seealso::

      https://www.boost.org/doc/libs/1_72_0/libs/graph/doc/adjacency_list.html

Functions
---------

.. cpp:function:: std::ostream &operator<<(std::ostream &os, const topology &t)

   Stream insertion operator.

   This function will direct to *os* a human-readable representation of the input
   :cpp:class:`~pagmo::topology` *t*.

   :param os: the input ``std::ostream``.
   :param t: the topology that will be directed to *os*.

   :return: a reference to *os*.

   :exception unspecified: any exception thrown by querying various properties of the topology and directing them to *os*.

Associated type traits
----------------------

.. cpp:class:: template <typename T> has_get_connections

   The :cpp:any:`value` of this type trait will be ``true`` if
   ``T`` provides a member function with signature:

   .. code-block:: c++

      std::pair<std::vector<std::size_t>, vector_double> get_connections(std::size_t) const;

   The ``get_connections()`` member function is part of the interface for the definition of a
   :cpp:class:`~pagmo::topology`.

   .. cpp:member:: static const bool value

      The value of the type trait.

.. cpp:class:: template <typename T> has_push_back

   The :cpp:any:`value` of this type trait will be ``true`` if
   ``T`` provides a member function with signature:

   .. code-block:: c++

      void push_back();

   The ``push_back()`` member function is part of the interface for the definition of a
   :cpp:class:`~pagmo::topology`.

   .. cpp:member:: static const bool value

      The value of the type trait.

.. cpp:class:: template <typename T> has_to_bgl

   .. versionadded:: 2.15

   The :cpp:any:`value` of this type trait will be ``true`` if
   ``T`` provides a member function with signature:

   .. code-block:: c++

      bgl_graph_t to_bgl() const;

   The ``to_bgl()`` member function is part of the optional interface
   for the definition of a :cpp:class:`~pagmo::topology`.

   .. cpp:member:: static const bool value

      The value of the type trait.

.. cpp:class:: template <typename T> is_udt

   This type trait detects if ``T`` is a user-defined topology (or UDT).

   Specifically, the :cpp:any:`value` of this type trait will be ``true`` if:

   * ``T`` is not a reference or cv qualified,
   * ``T`` is destructible, default, copy and move constructible, and
   * ``T`` satisfies :cpp:class:`pagmo::has_get_connections` and
     :cpp:class:`pagmo::has_push_back`.

   .. cpp:member:: static const bool value

      The value of the type trait.

.. cpp:namespace-pop::