3

カスタムプロパティライターをBGLで動作させるのに苦労しています。

struct IkGraph_VertexProperty {
    int id_ ;
    int type_ ;
    std::pair<int,int> gaussians_ ; // Type of Joint, Ids of Gaussians
};


struct IkGraph_VertexPropertyTag
{
typedef edge_property_tag kind;
static std::size_t const num; 
};

std::size_t const IkGraph_VertexPropertyTag::num = (std::size_t)&IkGraph_VertexPropertyTag::num;

typedef property<IkGraph_VertexPropertyTag, IkGraph_VertexProperty> vertex_info_type;

...メソッドで定義されたカスタムグラフ

typedef adjacency_list<setS, vecS, bidirectionalS, vertex_info_type, IkGraph_EdgeProperty> TGraph ;
TGraph testGraph ;
std::ofstream outStr(filename) ;
write_graphviz(outStr, testGraph, OurVertexPropertyWriter<TGraph,IkGraph_VertexPropertyTag, IkGraph_VertexProperty>(testGraph));

..。

template <class Graph, class VertexPropertyTag, class VertexProperty>
struct OurVertexPropertyWriter {

  OurVertexPropertyWriter(Graph &g_) : g(g_) {}

 template <class Vertex>
 void operator() (std::ostream &out, Vertex v) {

    VertexProperty p = get (VertexPropertyTag(), g, v);
      out << "[label=" << p.gaussians_.first << "]";

  }

 Graph &g;
};

これにより、一連のエラーが発生します。

私が本当にやりたいこと(そしてこれが可能かどうかはわかりません)は、これを一般化して、どのカスタムプロパティが存在するか/どのカスタムプロパティを出力したいかを渡すことができるようにすることです。

4

1 に答える 1

8

コードが期待どおりに動作することを確認できないため、コードを修正しません。しかし、私は同じ問題に行き詰まったので、コードの関連部分をあなたや他の人のための例として投稿します. これが役立つことを願っています。

グラフの定義

typedef boost::adjacency_list<boost::vecS, 
                              boost::vecS, 
                              boost::bidirectionalS, 
                              boost::no_property, 
                              EdgeProp, //this is the type of the edge properties
                              boost::no_property, 
                              boost::listS> Graph;

エッジ プロパティ

struct EdgeProp
{
        char name;
        //...

};

エッジのプロパティ ライター

template <class Name>
class myEdgeWriter {
public:
     myEdgeWriter(Name _name) : name(_name) {}
     template <class VertexOrEdge>
     void operator()(std::ostream& out, const VertexOrEdge& v) const {
            out << "[label=\"" << name[v].name << "\"]";
     }
private:
     Name name;
};

プロパティは、事前にエッジにアタッチする必要があります。 例えば

EdgeProp p;
p.name = 'a';
g[edge_descriptor] = p;

boost を呼び出して、graphviz ファイルを作成する

myEdgeWriter<Graph> w(g);
ofstream outf("net.gv");
boost::write_graphviz(outf,g,boost::default_writer(),w);

頂点プロパティ ライターには、デフォルトのライターを使用します。

于 2012-06-25T10:32:17.980 に答える