#directed-acyclic-graph #priority #conflict #edge #node #order #lazily

prio-graph

A lazily populated directed acyclic graph with top-level priority ordering

3 unstable releases

0.2.1 Dec 28, 2023
0.2.0 Nov 27, 2023
0.1.0 Oct 9, 2023

#228 in Data structures

Download history 11013/week @ 2024-01-05 10111/week @ 2024-01-12 13756/week @ 2024-01-19 5537/week @ 2024-01-26 6718/week @ 2024-02-02 4447/week @ 2024-02-09 9819/week @ 2024-02-16 11533/week @ 2024-02-23 12346/week @ 2024-03-01 12246/week @ 2024-03-08 12681/week @ 2024-03-15 12513/week @ 2024-03-22 13265/week @ 2024-03-29 15433/week @ 2024-04-05 14597/week @ 2024-04-12 14308/week @ 2024-04-19

59,928 downloads per month
Used in 24 crates (2 directly)

Custom license

24KB
428 lines

prio-graph example workflow

A library for building a directed acyclic graph that is lazily evaluated as new transactions are added. Edges are only present for the next-highest priority conflict for a particular resource, with the caveat that insertion order takes precedence over priority.

The PrioGraph structure keeps track of the nodes in the graph, the directed edges between them, a main queue, and mappings for distinct "chains" of transaction. For example:

graph LR;
A((A)) --> B((B)) --> C((C)) & D((D));
E((E)) --> F((F));

A and E have no conflicts and are the highest priority items within their prospective chains. These node's associated ids would be in the main queue, and would have different chain ids. If a transaction were added that conflicts with both chains, then these chains would be joined, and a mapping of joined chains is tracked in the PrioGraph.

graph LR;
A((A)) --> B((B)) --> C((C)) & D((D)) --> G((G));
E((E)) --> F((F)) --> G;

No runtime deps