【问题标题】:how to read graph-domain attributes with boost::read_graphml?如何使用 boost::read_graphml 读取图形域属性?
【发布时间】:2013-06-14 15:50:25
【问题描述】:

可能是一个愚蠢的问题,但我在网上找不到任何答案。我的应用程序从自定义文件中读取拓扑结构并从中构建 boost::graph。我正在转向更标准的 graphml 表示。我可以使用 vertex_descriptor 作为键来读取/写入节点属性,同样我可以将 edge_descriptor 用于边缘属性,但是图形属性呢?在 graphml 文件中读取它们时,它们将关联到哪种键类型?

为了解释我的疑问,这是我必须定义图形并读取 graphml 文件的代码:

struct NetworkNode {
  int ponCustomers;
  int asid;
}; //bundled property map for nodes

struct NetworkEdge {
  int length;
  Capacity maxCapacity;
  Capacity spareCapacity;
  std::set<Flow*> activeFlows;
  Capacity peakCapacity;
}; //bundled property map for edges

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, 
    NetworkNode, NetworkEdge> DGraph;
typedef DGraph::vertex_descriptor Vertex;
[...]
DGraph topology;
boost::dynamic_properties dp;
dp.property("asid", boost::get(&NetworkNode::asid, topology));
dp.property("ponCustomers", boost::get(&NetworkNode::ponCustomers, topology));
dp.property("length", boost::get(&NetworkEdge::length, topology));
dp.property("maxCapacity", boost::get(&NetworkEdge::maxCapacity, topology));
dp.property("spareCapacity", boost::get(&NetworkEdge::spareCapacity, topology));
dp.property("peakCapacity", boost::get(&NetworkEdge::peakCapacity, topology));    
std::map<Vertex, int> avgUsersMap;
boost::associative_property_map<std::map<Vertex, int> >
    avgUsersPMap(avgUsersMap);
dp.property("avgUsers", avgUsersPMap);
[...]
try {
  boost::read_graphml(stream, this->topology, dp);
} catch [...]

注意我如何创建新的关联映射来存储对图形定义有用的属性(例如,当我构建它时)但不值得在整个图形生命周期内存储在每个节点/边中。现在,其中一些属性与整个图相关;例如,我可以在 graphml 文件中定义类似

<key id="name" for="graph" attr.name="graphName" attr.type="string" />

如何定义所需的property_map并将其添加到dp,以便正确解析这些信息?

【问题讨论】:

    标签: c++ boost-graph graphml


    【解决方案1】:

    您可以为图形设置捆绑属性,就像对顶点和边所做的那样。

    类似这样的:

    struct graph_props {
       std::string myName;
    ...
    };
    
    typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, 
        NetworkNode, NetworkEdge, graph_props > DGraph;
    

    为了说服 boost::read_graphml 保存图形属性,您必须提供一个属性映射(只有一个成员)属性属性。也许有人可以指出一种更简洁的方法。

    类似这样的:

    std::map< std::string, std::string > attribute_name2name;
    boost::associative_property_map< std::map< std::string, std::string > >
            graphname_map( attribute_name2name );
    dp.property("graphname", graphname_map );
    boost::read_graphml(stream, this->topology, dp);
    topology[boost::graph_bundle].myName = get(graphname_map,"graphname");
    

    【讨论】:

      猜你喜欢
      • 2022-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多