如何使用 Boost Graph Library 获取边缘的端口标识符?

发布于 2024-10-20 15:48:38 字数 428 浏览 2 评论 0原文

使用Boost Graph Library,是否可以获得边缘的端口标识符?

示例:调用 read_graphviz 后,我可以迭代该图的边缘并打印它们的 node_id - 我得到“A -> B,A -> B ”。如何打印“A:p0 -> B:p1, A:p0 -> B:p2”之类的内容?

digraph G {
    A [label="A|<p0>p0"];
    B [label="B|<p1>p1|<p2>p2"];

    A:p0 -> B:p1;
    A:p0 -> B:p2;
}

二合字母 G 的渲染

Using the Boost Graph Library, is it possible to get the port identifiers for an edge?

Example: After calling read_graphviz, I can iterate through the edges of this graph and print their node_ids -- I get "A -> B, A -> B". How can I print something like "A:p0 -> B:p1, A:p0 -> B:p2"?

digraph G {
    A [label="A|<p0>p0"];
    B [label="B|<p1>p1|<p2>p2"];

    A:p0 -> B:p1;
    A:p0 -> B:p2;
}

Rendering of digraph G

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

似梦非梦 2024-10-27 15:48:38

来自 read_graphviz_new.hpp 源:

struct edge_info {
  node_and_port source;
  node_and_port target;
  properties props;
};

其中 node_and_port 看起来像这样:

struct node_and_port {
  node_name name;
  std::string angle; // Or empty if no angle
  std::vector<std::string> location; // Up to two identifiers
  // ...
}

我认为(但尚未验证)如果您直接使用以下方式调用解析器,这些结果是可用的:

 void parse_graphviz_from_string(const std::string& str, parser_result& result, bool want_directed);

在命名空间中boost::read_graphviz_detail。如果您直接使用 read_graphviz,它也可能在 dynamic_property_map 中可用;它在内部引用read_graphviz_new


注意:graphviz.hpp中,基于#ifdef选择两个graphviz解析器之一:

#ifdef BOOST_GRAPH_USE_SPIRIT_PARSER
  return read_graphviz_spirit(data.begin(), data.end(), graph, dp, node_id);
#else // Non-Spirit parser
  return read_graphviz_new(data,graph,dp,node_id);
#endif

如果我正确地阅读了这个,那么非精神解析器就是你想要的;精神系的看起来像是无视端口的。

无论如何,这只是基于快速查看 boost v. 1.44 的源代码;对我来说,感兴趣的代码位于 /usr/include/boost/graph/detail/read_graphviz_new.hpp 中。我还没有测试过,但看起来所有的管道都在那里。

From the read_graphviz_new.hpp source:

struct edge_info {
  node_and_port source;
  node_and_port target;
  properties props;
};

Where node_and_port looks like this:

struct node_and_port {
  node_name name;
  std::string angle; // Or empty if no angle
  std::vector<std::string> location; // Up to two identifiers
  // ...
}

I think (but have not verified) that these results are available if you call the parser directly using:

 void parse_graphviz_from_string(const std::string& str, parser_result& result, bool want_directed);

in namespace boost::read_graphviz_detail. It may also be available in the dynamic_property_map if you use read_graphviz directly; it internally refers to read_graphviz_new.


Note: In graphviz.hpp, one of two graphviz parsers is selected, based on an #ifdef:

#ifdef BOOST_GRAPH_USE_SPIRIT_PARSER
  return read_graphviz_spirit(data.begin(), data.end(), graph, dp, node_id);
#else // Non-Spirit parser
  return read_graphviz_new(data,graph,dp,node_id);
#endif

If I am reading this correctly, then the non-spirit parser is the one you want; the spirit-based one looks like it disregards ports.

Anyway, this is just based on a quick look at the source for boost v. 1.44; for me code of interest lives in /usr/include/boost/graph/detail/read_graphviz_new.hpp. I have not tested this, but it looks like all the plumbing is there.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文