-
Notifications
You must be signed in to change notification settings - Fork 430
feat(parser): allow parsing graphs from Dot/Graphviz files #653
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
I added tests for parsing from both a string and an existing file (I used |
|
In addition, I implemented |
Cargo.toml
Outdated
| serde = { version = "1.0", optional = true } | ||
| serde_derive = { version = "1.0", optional = true } | ||
| rayon = { version = "1.5.3", optional = true } | ||
| dot-parser = { version = "0.3", optional = true} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm sorry, I don't have full bandwidth to review well, but I hope others do.
dot-parser already optionally depends on petgraph. How does it all interact, when petgraph optionally depends on dot-parser?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi bluss,
dot-parser depends on petgraph for a single thing: to export parsed graphs as petgraph's Graph. (see here : https://codeberg.org/bromind/dot-parser/src/branch/master/src/canonical.rs#L156 ).
Basically, this is a poor attempt to do what I intend to do (in a cleaner way) with this PR: to get petgraphs directly from Dot files. However, implementing that in dot-parser is intrinsically bad (imho), since it wouldn't be very flexible in terms of petgraph's version (e.g. as of today, dot-parser exports Graphs from petgraph 0.6.5, which causes issues if the user wants/needs to use an other version).
Eventually, if this PR gets accepted, I'll removed the dependency.
From a more practical aspect, the current status is not so much of a problem, since the PR does not uses the petgraph feature of dot-parser, so petgraph should not even appear down the dependency tree/there is not cyclic dependency issue.
|
Hi, I've been looking to implement the trait for other graph types. However, I think it is reasonable to have it implemented only for |
|
I would like your opinion on re-exported items. So far, this PR re-export/show the following types from the dot-parser crate:
I'm also thinking about making pest errors directly visible, or nesting them in a wrapper. Is there any opinion on those re-exports? I haven't think about it too much yet, and I'm not really happy with the current situation. Any suggestion? |
|
So, regarding my previous comment about reexported items from the dot-parser library, I hid them behind type aliases. I think it is a good tradeoff. Also, parsing errors are now used: if an incorrect DOT string/file is used, an error will be displayed. This is simply using errors from the dot-parser lib and hiding them in ad-hoc opaque |
|
Hi, is it possible to add more tests with graph isomorphism checks? This will make it possible to more strictly check the correctness of parsing in order to avoid possible regressions in the future. |
05afdda to
31cc29c
Compare
I added a few more tests in 8ff3d6e . Only 3 are related to isomorphism (checking isomorphism, isomorphism of subgraph, and not isomorphism), but I also included checks with cyclic graphs. |
|
I just tested the semver-checks failure, and it definitively seems to be a false positive. In a new and separate project, I wrote a dummy graph to implement (For reference: obi1kenobi/cargo-semver-checks#1200) use petgraph::data::{Build, Create};
use petgraph::visit::{Data, GraphBase, NodeCount};
use petgraph::dot::dot_parser::{ParseFromDot, DotNodeWeight, DotAttrList};
use std::marker::PhantomData;
#[derive(Default)]
struct MyDummyGraph<'a> {
a: PhantomData<&'a ()>
}
impl<'a> GraphBase for MyDummyGraph<'a> {
type EdgeId = ();
type NodeId = ();
}
impl<'a> Data for MyDummyGraph<'a> {
type NodeWeight = DotNodeWeight<'a>;
type EdgeWeight = DotAttrList<'a>;
}
impl<'a> NodeCount for MyDummyGraph<'a> {
fn node_count(&self) -> usize {
0
}
}
impl<'a> Build for MyDummyGraph<'a> {
fn add_node(&mut self, _data: <Self as Data>::NodeWeight) -> <Self as GraphBase>::NodeId {
return ();
}
fn update_edge(
&mut self,
_from: <MyDummyGraph as GraphBase>::NodeId,
_to: <MyDummyGraph as GraphBase>::NodeId,
_weight: <MyDummyGraph as Data>::EdgeWeight,
) -> <Self as GraphBase>::EdgeId {
return ();
}
}
impl<'a> Create for MyDummyGraph<'a> {
fn with_capacity(_n: usize, _e: usize) -> Self {
Self::default()
}
}
impl<'a> ParseFromDot<'a> for MyDummyGraph<'a> {}
fn main() {
println!("Hello, world!");
} |
…to statically import them.
The code is modified to accomodate any graph type that implements Create.
…epends on petgraph
0.5.1 fixes a minor bug with token generation of dotgraphs with anonymous subgraphs.
|
Please apply |
ABorgna
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice!
## 🤖 New release * `petgraph`: 0.8.1 -> 0.8.2 (✓ API compatible changes) <details><summary><i><b>Changelog</b></i></summary><p> <blockquote> ## [0.8.2](https://github.com/petgraph/petgraph/compare/petgraph@v0.8.1...petgraph@v0.8.2) - 2025-06-06 ### Bug Fixes - Ford Fulkerson sometimes Panics on StableGraphs ([#793](#793)) - Run Maximal Cliques Quickcheck only on Digraphs which are symmetrical ([#800](#800)) - Run Steiner Tree Quickcheck on the connected components to properly support disconnected graphs ([#801](#801)) - Quickcheck random01 function only outputs 0 ([#798](#798)) ### Documentation - Specify that Acyclic::try_udpate_edge may add an edge ([#770](#770)) - Update remove_node doc comment in graphmap.rs ([#663](#663)) - Add examples to minimum spanning tree functions ([#808](#808)) - Minimal typo fix in comments ([#803](#803)) - Update docs.rs ([#807](#807)) - Add note about `StableGraph::edge_indices` behaviour ([#812](#812)) - Clarification of references to nodes and V (refresh #358) ([#814](#814)) - Fix link and mention Dfs and Bfs as special case in examples ([#816](#816)) - Unify algo docs ([#815](#815)) ### New Features - *(parser)* allow parsing graphs from Dot/Graphviz files ([#653](#653)) - Implement `DataMap` for `GraphMap` graphs ([#776](#776)) - Add Johnson's algorithm ([#741](#741)) - Add algorithm to find bridge edges ([#590](#590)) ### Performance - Reuse queue allocation in `maximum_matching` main loop ([#817](#817)) ### Refactor - Fix new clippy warnings ([#791](#791)) </blockquote> </p></details> --- This PR was generated with [release-plz](https://github.com/release-plz/release-plz/). --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: starovoid <prototyperailgun@gmail.com>
## 🤖 New release * `petgraph`: 0.8.1 -> 0.8.2 (✓ API compatible changes) <details><summary><i><b>Changelog</b></i></summary><p> <blockquote> ## [0.8.2](https://github.com/petgraph/petgraph/compare/petgraph@v0.8.1...petgraph@v0.8.2) - 2025-06-06 ### Bug Fixes - Ford Fulkerson sometimes Panics on StableGraphs ([petgraph#793](petgraph#793)) - Run Maximal Cliques Quickcheck only on Digraphs which are symmetrical ([petgraph#800](petgraph#800)) - Run Steiner Tree Quickcheck on the connected components to properly support disconnected graphs ([petgraph#801](petgraph#801)) - Quickcheck random01 function only outputs 0 ([petgraph#798](petgraph#798)) ### Documentation - Specify that Acyclic::try_udpate_edge may add an edge ([petgraph#770](petgraph#770)) - Update remove_node doc comment in graphmap.rs ([petgraph#663](petgraph#663)) - Add examples to minimum spanning tree functions ([petgraph#808](petgraph#808)) - Minimal typo fix in comments ([petgraph#803](petgraph#803)) - Update docs.rs ([petgraph#807](petgraph#807)) - Add note about `StableGraph::edge_indices` behaviour ([petgraph#812](petgraph#812)) - Clarification of references to nodes and V (refresh petgraph#358) ([petgraph#814](petgraph#814)) - Fix link and mention Dfs and Bfs as special case in examples ([petgraph#816](petgraph#816)) - Unify algo docs ([petgraph#815](petgraph#815)) ### New Features - *(parser)* allow parsing graphs from Dot/Graphviz files ([petgraph#653](petgraph#653)) - Implement `DataMap` for `GraphMap` graphs ([petgraph#776](petgraph#776)) - Add Johnson's algorithm ([petgraph#741](petgraph#741)) - Add algorithm to find bridge edges ([petgraph#590](petgraph#590)) ### Performance - Reuse queue allocation in `maximum_matching` main loop ([petgraph#817](petgraph#817)) ### Refactor - Fix new clippy warnings ([petgraph#791](petgraph#791)) </blockquote> </p></details> --- This PR was generated with [release-plz](https://github.com/release-plz/release-plz/). --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: starovoid <prototyperailgun@gmail.com>
This is a PR that adds support for Dot/Graphviz parsing. Parsing can happen both at runtime and at compile time (i.e. there are functions and macros).
It fixes #446 and #466 .
Internally, it uses the
dot_parsercrate (https://crates.io/crates/dot-parser), the implementation is simply a thin wrapper over that crate. This wrapper is a trait (ParseFromDot), introduced in a new modulecrate::dot::dot_parser. I also added a featuredot_parserto gate this module.The modifications do not introduce breaking changes.
TODO List (this is just what I have on the top of my head right now, feel free to edit if you think of other items):
ParseFromDotfor existing graph types.dot_parsercrate side).