Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Boost Graph Library: write graphviz

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

C++ Boost

write_graphviz

// Output graph structure without properties.
template < typename VertexAndEdgeListGraph >
void
write_graphviz(std::ostream& out, const VertexAndEdgeListGraph& g);
// Graph structure with customized property output
template < typename VertexAndEdgeListGraph, typename VertexPropertyWriter >
void
write_graphviz(std::ostream& out, const VertexAndEdgeListGraph& g,
               VertexPropertyWriter vpw);
template < typename VertexAndEdgeListGraph, typename VertexPropertyWriter,
           typename EdgePropertyWriter >
void
write_graphviz(std::ostream& out, const VertexAndEdgeListGraph& g,
               VertexPropertyWriter vpw, EdgePropertyWriter epw);
template < typename VertexAndEdgeListGraph, typename VertexPropertyWriter,
           typename EdgePropertyWriter, typename GraphPropertyWriter >
void
write_graphviz(std::ostream& out, const VertexAndEdgeListGraph& g,
               VertexPropertyWriter vpw, EdgePropertyWriter epw,
               GraphPropertyWriter gpw);
template < typename VertexAndEdgeListGraph, typename VertexPropertyWriter,
           typename EdgePropertyWriter, typename GraphPropertyWriter,
           typename VertexID >
void
write_graphviz(std::ostream& out, const VertexAndEdgeListGraph& g,
               VertexPropertyWriter vpw, EdgePropertyWriter epw,
               GraphPropertyWriter gpw, VertexID vertex_id);
// Graph structure with dynamic property output
template<typename Graph>
void
write_graphviz_dp(std::ostream& out, const Graph& g,
                  const dynamic_properties& dp,
                  const std::string& node_id = "node_id");
template<typename Graph, typename VertexID>
void
write_graphviz_dp(std::ostream& out, const Graph& g,
                  const dynamic_properties& dp, const std::string& node_id,
                  VertexID vertex_id);

Это для записи объекта графа BGL в поток вывода в формате графвиза точка AT&T chartviz чтобы нарисовать картину с хорошим макетом.

Первая версия с двумя параметрами запишет граф в std::ostream где каждая вершина представлена своей численной вершиной ID. Если у пользователей есть внутренние или внешние свойства для каждой вершины в графе, вторая версия выше предоставляет способ печати этих свойства в файл формата графвиза. Например, если каждая вершина в графе есть свой ярлык через объект карты свойств имя, пользователи могут использовать вторую версию:

  write_graph(out, g, make_label_writer(name));
Функция утилиты make_label_writer возвращает предопределенное PropertyWriter для вертикальные этикетки. Аналогично, третий версия и четвертая версия требуют вершины PropertyWriter, edge PropertyWriter, и граф PropertyWriter, соответственно.

Две перегрузки write_graphviz_dp будут излучать все свойства, хранящиеся в dynamic_properties объект, тем самым сохраняя свойства, которые были прочитаны через двойную функцию read_graphviz. С этими перегрузка, node_id - это название карты свойств, сохраняет идентификаторы каждого узла для использования в выводе (если он хранится в dynamic_properties структура); альтернативно, можно предоставить карту произвольного свойства для vertex_id, давая Идентификаторы вершин. В этом случае имя node_id все еще должно быть поставлено для подавления его вывод как этикетка вершин.

Where Defined

boost/graph/graphviz.hpp

PropertyWriter

PropertyWriter используется в функции write_graphviz печати вершин, ребер или графических свойств. Существует два типа PropertyWriter. Один для вершины или края. Другой для графа. Таким образом, пользователи могут легко расширить write_graphviz функция создав свой собственный PropertyWriter только.

A PropertyWriter для вершин или ребер - это фанктор, который можно назвать двумя параметрами: std::ostream и либо вершина, либо реберный дескриптор. Он должен выводить пара скобок с серией зажимов "name=value " внутри. Каждое задание должно быть разделено либо с пространством, с коммой, либо с полуколоном. Следующий фанктор, предоставленный BGL, является примером PropertyWriter для вершины или края. Он используется для печати этикетки каждой вершины или края.

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

Предоставляется функция для удобного создания этого писателя:

template < class Name >
label_writer<Name>
make_label_writer(Name n);

A PropertyWriter для графов - это фанктор, который называется одним параметром типа std::ostream и должен напечатать ряд свойств графа. Следующие выдержка кода является примером PropertyWriter для графа:

  struct sample_graph_writer {
    void operator()(std::ostream& out) const {
      out << "graph [bgcolor=lightgrey]" << std::endl;
      out << "node [shape=circle color=white]" << std::endl;
      out << "edge [style=dashed]" << std::endl;
    }
  };
}

Существует класс default_writer, который может быть использован как vertex/edge и графа собственность писателя, и ничего не делает. Это полезно, когда должны быть написаны только реберные свойства, но интерфейс функции также требует vertex property Writer.

Параметры

OUT: std::ostream& out
Стандарт std::ostream объект.
IN: VertexAndEdgeListGraph& g
Ориентированный или ненаправленный граф. Тип графа должен быть моделью VertexAndEdgeListGraph. В большинстве случаев Граф должен иметь внутреннюю карту свойств vertex_index.
IN: VertexPropertyWriter vpw
Functor, который модели PropertyWriter напечатать свойства вершины.
Default: default_writer()
IN: EdgePropertyWriter epw
Functor, который модели PropertyWriter напечатать свойства края.
Default: default_writer()
IN: GraphPropertyWriter epw
Functor, который модели PropertyWriter напечатать свойства графа.
Default: default_writer()
IN: dynamic_properties& dp
Содержит все вершины и реберные свойства, которые должны быть Выпущено писателем GraphViz.
IN: const std::string& node_id
Название карты свойств, которая предоставляет идентификаторы для вершины в графе.
Default: "node_id"
IN: VertexID vertex_id
Карта свойств, на которой модели Readable Property Map, ключевым типом которой является вершинный дескриптор графа, и тип ценности которого может быть записан в поток. Значение должно быть уникальным дескриптором для каждой вершины, и будет использоваться для обозначения каждого узла в файле Graphviz (он будет удален должным образом для вывода Graphviz).
Default: Если нет объекта dynamic_properties, get(vertex_index, g). В противном случае, карта динамического свойства, которая обращается к карте свойств в dp, имя которой дается параметром node_id.

Пример

Этот пример демонстрирует использование интерфейса BGL-Graphviz для записи a График BGL в файл формата Graphviz.
#include <boost/graph/graphviz.hpp>
enum files_e { dax_h, yow_h, boz_h, zow_h, foo_cpp,
               foo_o, bar_cpp, bar_o, libfoobar_a,
               zig_cpp, zig_o, zag_cpp, zag_o,
                 libzigzag_a, killerapp, N };
const char* name[] = { "dax.h", "yow.h", "boz.h", "zow.h", "foo.cpp",
                       "foo.o", "bar.cpp", "bar.o", "libfoobar.a",
                       "zig.cpp", "zig.o", "zag.cpp", "zag.o",
                       "libzigzag.a", "killerapp" };
int main(int,char*[])
{
  typedef pair<int,int> Edge;
  Edge used_by[] = {
    Edge(dax_h, foo_cpp), Edge(dax_h, bar_cpp), Edge(dax_h, yow_h),
    Edge(yow_h, bar_cpp), Edge(yow_h, zag_cpp),
    Edge(boz_h, bar_cpp), Edge(boz_h, zig_cpp), Edge(boz_h, zag_cpp),
    Edge(zow_h, foo_cpp),
    Edge(foo_cpp, foo_o),
    Edge(foo_o, libfoobar_a),
    Edge(bar_cpp, bar_o),
    Edge(bar_o, libfoobar_a),
    Edge(libfoobar_a, libzigzag_a),
    Edge(zig_cpp, zig_o),
    Edge(zig_o, libzigzag_a),
    Edge(zag_cpp, zag_o),
    Edge(zag_o, libzigzag_a),
    Edge(libzigzag_a, killerapp)
  };
  const int nedges = sizeof(used_by)/sizeof(Edge);
  int weights[nedges];
  std::fill(weights, weights + nedges, 1);
  using namespace boost;
  typedef adjacency_list< vecS, vecS, directedS,
      property< vertex_color_t, default_color_type >,
      property< edge_weight_t, int >
    > Graph;
  Graph g(used_by, used_by + nedges, weights, N);
  write_graphviz(std::cout, g, make_label_writer(name));
}
Результат будет следующим:
digraph G {
0 -> 4;
0 -> 6;
0 -> 1;
0 [label="dax.h"];
1 -> 6;
1 -> 11;
1 [label="yow.h"];
2 -> 6;
2 -> 9;
2 -> 11;
2 [label="boz.h"];
3 -> 4;
3 [label="zow.h"];
4 -> 5;
4 [label="foo.cpp"];
5 -> 8;
5 [label="foo.o"];
6 -> 7;
6 [label="bar.cpp"];
7 -> 8;
7 [label="bar.o"];
8 -> 13;
8 [label="libfoobar.a"];
9 -> 10;
9 [label="zig.cpp"];
10 -> 13;
10 [label="zig.o"];
11 -> 12;
11 [label="zag.cpp"];
12 -> 13;
12 [label="zag.o"];
13 -> 14;
13 [label="libzigzag.a"];
14;
14 [label="killerapp"];
6 -> 0;
}

Каталог примеров содержит пример dynamic_properties.

See Also

read_graphviz

Copyright © 2000-2001llee@cs.indiana.edu)
jsiek@osl.iu.edu

Статья Boost Graph Library: write graphviz раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 05:02:32/0.0066819190979004/1