Skip to main content

Algorithms for graphs, that are computed and/or adapted on the fly

Project description

NoGraphs simplifies the analysis of graphs that can not or should not be fully computed, stored or adapted, e.g. infinite graphs, large graphs and graphs with expensive computations. (Here, the word graph denotes the thing with vertices and edges, not with diagrams.)

The approach: Graphs are computed and/or adapted in application code on the fly (when needed and as far as needed). Also, the analysis and the reporting of results by the library happens on the fly (when, and as far as, results can already be derived).

Think of it as graph analysis - the lazy (evaluation) way.

Feature overview

  • Algorithms: DFS, BFS, topological search, Dijkstra, A* and MST.

  • Flexible graph notion: Infinite directed multigraphs with loops and attributes (this includes multiple adjacency, cycles, self-loops, directed edges, weighted edges and edges with application specific attributes). Your vertices can be nearly anything. Currently, all algorithms are limited to locally finite graphs (i.e., a vertex has only finitely many outgoing edges).

  • Results: Reachability, depth, distance, paths and trees. Paths can be calculated with vertices or edges or attributed edges and can be iterated in both directions.

  • Flexible API: It eases operations like graph pruning, graph product and graph abstraction, the computation of search-aware graphs and traversals of vertex equivalence classes on the fly. It is even possible to replace some of the internal data structures and to interfere with them during the search.

  • Implementation: Pure Python (>=3.9). It introduces no further dependencies. Runtime and memory performance have been goals.

  • Source: Available here.

  • Licence: MIT.

Documentation

Example

Our graph is directed, weighted and has infinitely many edges. These edges are defined in application code by the following function. For a vertex i (here: an integer) as the first of two parameters, it yields the edges that start at i as tuples (end_vertex, edge_weight). What a strange graph - we do not know how it looks like…

>>> def next_edges(i, _):
...     j = (i + i // 6) % 6
...     yield i + 1, j * 2 + 1
...     if i % 2 == 0:
...         yield i + 6, 7 - j
...     elif i > 5:
...         yield i - 6, 1

We would like to find out the distance of vertex 5 from vertex 0, i.e., the minimal necessary sum of edge weights of any path from 0 to 5, and (one of) the shortest paths from 0 to 5.

We do not know which part of the graph is necessary to look at in order to find the shortest path and to make sure, it is really the shortest. So, we use the traversal strategy TraversalShortestPaths of NoGraphs. It implements the well-known Dijkstra graph algorithm in the lazy evaluation style of NoGraphs.

>>> import nographs as nog
>>> traversal = nog.TraversalShortestPaths(next_edges)

We ask NoGraphs to traverse the graph starting at vertex 0, to calculate paths while doing so, and to stop when visiting vertex 5.

>>> traversal.start_from(0, build_paths=True).go_to(5)
5

The state data of this vertex visit contains our result:

>>> traversal.distance
24
>>> traversal.paths[5]
(0, 1, 2, 3, 4, 10, 16, 17, 11, 5)

We learn that we need to examine the graph at least till vertex 17 to find the shortest path from 0 to 5. It is not easy to see that from the definition of the graph…

A part of the graph, the vertices up to 41, is shown in the following picture. Arrows denote directed edges. The edges in red show shortest paths from 0 to other vertices.

Welcome to NoGraphs!

https://nographs.readthedocs.io/en/latest/_images/nographs_example_graph.PNG

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nographs-0.0.1.dev1.tar.gz (86.3 kB view details)

Uploaded Source

Built Distribution

nographs-0.0.1.dev1-py3-none-any.whl (23.0 kB view details)

Uploaded Python 3

File details

Details for the file nographs-0.0.1.dev1.tar.gz.

File metadata

  • Download URL: nographs-0.0.1.dev1.tar.gz
  • Upload date:
  • Size: 86.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.62.3 importlib-metadata/4.10.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for nographs-0.0.1.dev1.tar.gz
Algorithm Hash digest
SHA256 dfcff0c33baf3aed8cd4f8ba29f6f6cb6aa56722f7fbd8f6024359721bdac39d
MD5 6dd476b6cac0cf6906933c43d5d59da5
BLAKE2b-256 57c2a79bcc10d65e4666b6ee6e0d5f1bdd2f100891539c44696b8d56288e4694

See more details on using hashes here.

File details

Details for the file nographs-0.0.1.dev1-py3-none-any.whl.

File metadata

  • Download URL: nographs-0.0.1.dev1-py3-none-any.whl
  • Upload date:
  • Size: 23.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.62.3 importlib-metadata/4.10.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for nographs-0.0.1.dev1-py3-none-any.whl
Algorithm Hash digest
SHA256 f429442e3a3764046b11f9f5a0eac0cc490cb1d81c9f3deb5dea1c3fdfafb1d8
MD5 927cc822b52b9e616245886422071fec
BLAKE2b-256 60dfb27fe52947706b0be18d096bcf97ea2c6b1907a5e0ffca9bd2fddfa76931

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page