2013-06-14 7 views
0

아마도 바보 같은 질문이지만 온라인에서 답변을 찾을 수 없습니다. 내 응용 프로그램은 사용자 정의 파일에서 토폴로지를 읽고 부스트 :: 그래프를 작성합니다. 더 표준적인 그래프 표현으로 옮겨 가고 있습니다. vertex_descriptor를 키로 사용하여 노드 속성을 읽고 쓸 수 있으며 마찬가지로 가장자리 특성에 edge_descriptor를 사용할 수 있지만 그래프 특성은 무엇입니까? graphml 파일에서 어떤 키 유형을 읽을 때 연관 될 것입니까?boost :: read_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 [...] 

공지 사항 I 그래프의 정의에 대한 유용한 속성을 저장하는 새로운 연관지도를 만들 방법 :

내 의심을 설명하기 위해, 여기에 내가 그래프를 정의하고 graphml 파일을 읽을 수있는 코드는 (예 : 빌드 할 때) 전체 그래프 수명 동안 모든 단일 노드/에지에 저장할 가치가 없습니다. 이제 이러한 속성 중 일부는 전체 그래프와 관련됩니다. 예를 들어 나는

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

어떻게 필요한 property_map를 정의하고 정보의 비트가 올바르게 구문 분석하여 조치 할 수 있도록 DP에 추가 할 같은 graphml 파일 뭔가를 정의 할 수있다?

답변

2

꼭지점 및 가장자리와 마찬가지로 그래프의 번들 속성을 설정할 수 있습니다. 이 같은

뭔가 :

당신이 (한 회원이있을 것이다) 속성 맵을 제공해야 그래프 속성을 저장하는 부스트 :: read_graphml을 설득하기 위해
struct graph_props { 
    std::string myName; 
... 
}; 

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, 
    NetworkNode, NetworkEdge, graph_props > DGraph; 

불행하게도, AFAIK 당신이 추출해야합니다 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");