Added
- Added lookahead window in SCGR: Instead of looking for routes of the entire
period that the contact graph holds information, the algorithm makes an
educated guess as of in which timespan a route could be expected. This is
based on a static value for the first run and the previously observed mean
route EDT times 1.2 in subsequent runs. If no route can be found within the
window, the Dijkstra run is repeated without the window to ensure that a
route is found if there is one. With this approach, in Simulations usually
more than 90% of the found routes were within the window, thus reducing the
overall route finding time significantly while returning the same results.
- Added option to ignore contacts that lie beyond the simulation window. I.e.
if the scenario source file contains more topology information, that
information is discarded during the ContactPlan generation and thus not used
for the contact ContactGraph generation.
- Implemented new custom backend (called qsim) that handles the event-based
simulation procedure much faster than simpy. Changed contact and packet
generators to use the new backend.
- Added rich comparison methods for packet object (based on packet identifier).
- Contact Utilization Analysis. The average value for all contacts is provided
in the standard post-simulation summary and the function
`get_utilization_list` returns a list of the utilizations per individual
contact.
Changed
- Switched to python 3.7.0 to make use of the integrated dataclasses ("mutable
namedtuple"). Updated docker image in CI.
- Removed redundant code in SCGR.
- Refactoring of the Dijkstra implementation to improve the performance.
Previously, many variables for the search were initialized for all nodes. By
rewriting Dijkstra, this could be mitigated. Instead, the variables are
considered to be in a certain stage if they are not initialized. They are
instead create on-demand if needed.
- Switched visited data structure in Dijkstra from list to set, which hashes
the values and thus yields in better performance.
- Changed removal of past contacts from contact graph to on-demand. Instead of
iterating over the entire graph all the time, the approaches are now
removing the old contact only if they encounter them again in the neighbor function. Improves performance by getting rid of another iteration over all
elements of the graph.
- Removed profiling script from CI. It takes way too long on the CI runner
while having only very limited CI testing significance.
- Changed time steps/unit to milliseconds and removed round() where possible.
Also switched to int instead of float wherever possible to improve
performance. With the new approach, round is only used in places where the
performance impact is not that severe, but e.g. in is_capacity_sufficient()
which is called very often, an approximation is used that slightly
deteriorates the overall routing efficiency (because it underestimates the
remaining capacity of contacts due to it's conservative estimation). After a
routing decision has been made, the precise time is calculated using round().
- Reduced computational complexity of the ContactGraph generation procedure.
Moved edge generation into a separate internal static function.
- Changed CI scripts to new ms time unit.
- Adapted documentation to new ms time unit and int type.
Fixed
- Fixed static selection of SCGR as profiling algorithm in profiler script.
- Fixed bug where due to missing parentheses the datarate during the contact
graph generation was computed incorrectly (much higher).
- Fixed division-by-zero bug in profiler script.