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

Boost read_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

Boost read_graphviz

namespace boost {
  template <typename MutableGraph>
  bool read_graphviz(std::istream& in, MutableGraph& graph,
                     dynamic_properties& dp,
                     const std::string& node_id = "node_id");
  template <typename MutableGraph>
  bool read_graphviz(std::string& str, MutableGraph& graph,
                     dynamic_properties& dp,
                     const std::string& node_id = "node_id");
  template <typename InputIterator, typename MutableGraph>
  bool read_graphviz(InputIterator begin, InputIterator end,
                     MutableGraph& graph, dynamic_properties& dp,
                     const std::string& node_id = "node_id");
}

читать_graphvizФункция интерпретирует график, описанный с помощьюГрафа ВизЯзык DOT создает BGL-граф, который фиксирует это описание. Используя эти функции, вы можете инициализировать график, используя данные, хранящиеся в виде текста.

Язык DOT может указывать как направленные, так и ненаправленные графы, иread_graphvizРазница между ними. Необходимо пройтиread_graphvizненаправленный граф при чтении ненаправленного графа; то же самое верно для направленных графов. Кроме того,читать_graphvizбросит исключение, если столкнется с параллельными краями и не сможет добавить их к графу.

Для обработки свойств, выраженных на языке DOT,read_graphvizберет объектdynamic_propertiesи оперирует его коллекцией карт свойств. Читатель передает все свойства, встречающиеся этому объекту, используя клавиши строк GraphViz в качестве ключей свойств. Кроме того,read_graphvizхранит имена идентификаторов узлов под картой свойств вершины под названиемnode_id.

Requirements:
  • Тип графа должен моделировать концепциюMutable Graph.
  • Тип итератора должен моделировать концепциюInput Iterator.
  • Типы значений карты свойств должны быть конструктивными по умолчанию.

Exceptions

struct graph_exception : public std::exception {
  virtual ~graph_exception() throw();
  virtual const char* what() const throw() = 0;
};
struct bad_parallel_edge : public graph_exception {
  std::string from;
  std::string to;
  bad_parallel_edge(const std::string&, const std::string&);
  virtual ~bad_parallel_edge() throw();
  const char* what() const throw();
};
struct directed_graph_error : public graph_exception {
  virtual ~directed_graph_error() throw();
  virtual const char* what() const throw();
};
struct undirected_graph_error : public graph_exception {
  virtual ~undirected_graph_error() throw();
  virtual const char* what() const throw();
};
struct bad_graphviz_syntax: public graph_exception {
  std::string errmsg;
  bad_graphviz_syntax(const std::string&);
  virtual ~bad_graphviz_syntax() throw();
  virtual const char* what() const throw();
};

При определенных обстоятельствахread_graphvizотбросит одно из вышеперечисленных исключений. Все три конкретных исключения могут быть пойманы с использованием общегографа_исключения, когда большая точность не требуется. Кроме того, все вышеперечисленные исключения вытекают из стандартаstd:: Исключениедля еще более обобщенной обработки ошибок.

Исключениеbad_parallel_edgeвозникает, когда попытка добавить параллельный край к поставляемому MutableGraph терпит неудачу. Язык DOT поддерживает параллельные края, но некоторые BGL-совместимые типы графов этого не делают. Одним из примеров такого графика являетсяboost::adjacency_list, что позволяет в лучшем случае один край может между любыми двумя вершинами.

Исключениеdirect_graph_errorпроисходит, когда ненаправленный тип графа передаетсяread_graph, но текстовое представление графа направлено, как указано ключевым словомdigraphна языке DOT.

Исключениеundirected_graph_errorпроисходит, когда направленный тип графа передаетсяread_graph, но текстовое представление графа ненаправлено, как указано ключевым словомграфна языке DOT.

Исключениеbad_graphviz_syntaxпроисходит, когда ввод графа не является действительным графом GraphViz.

Example

Следующий пример иллюстрирует относительно простое использование считывателя GraphViz для заполнения графаadjacency_list

// Vertex properties
typedef property < vertex_name_t, std::string,
          property < vertex_color_t, float > > vertex_p;
// Edge properties
typedef property < edge_weight_t, double > edge_p;
// Graph properties
typedef property < graph_name_t, std::string > graph_p;
// adjacency_list-based type
typedef adjacency_list < vecS, vecS, directedS,
  vertex_p, edge_p, graph_p > graph_t;
// Construct an empty graph and prepare the dynamic_property_maps.
graph_t graph(0);
dynamic_properties dp;
property_map<graph_t, vertex_name_t>::type name =
  get(vertex_name, graph);
dp.property("node_id",name);
property_map<graph_t, vertex_color_t>::type mass =
  get(vertex_color, graph);
dp.property("mass",mass);
property_map<graph_t, edge_weight_t>::type weight =
  get(edge_weight, graph);
dp.property("weight",weight);
// Use ref_property_map to turn a graph property into a property map
boost::ref_property_map<graph_t*,std::string>
  gname(get_property(graph,graph_name));
dp.property("name",gname);
// Sample graph as an std::istream;
std::istringstream
  gvgraph("digraph { graph [name=\"graphname\"]  a  c e [mass = 6.66] }");
bool status = read_graphviz(gvgraph,graph,dp,"node_id");

Building the GraphViz Readers

Чтобы использовать читатели GraphViz, вам нужно будет создать и связать с библиотеками "boost_graph" и "boost_regex". Эти библиотеки могут быть построены, следуя инструкциямBoost Jam Build Instructionsдля подкаталоговlibs/graph/buildиlibs/regex/build.

Notes

  • Функцияread_graphvizне использует код из распределения GraphViz для интерпретации языка DOT. Скорее, реализация была основана на документации, найденной на веб-сайте GraphViz, а также на экспериментах, проводимых с использованием приложения точек. Полученная интерпретация может тонко отличаться от точки для некоторых угловых случаев, которые не очень точно указаны.
  • При успешном чтении графа каждая вершина и край будут иметь связанное значение для каждого соответствующего свойства края и вершины, встречающегося при интерпретации графа. Эти значения будут установлены с использованием объектаDynamic_properties. Те края и вершины, которым явно не дано значение для свойства (и это свойство не имеет дефолта), получат построенное по умолчанию значение типа стоимости.Убедитесь, что типы значений карты свойств являются конструируемыми по умолчанию.
  • read_graphvizтрактует подграфы как синтаксический сахар. Он не отражает подграфы как фактические объекты в BGL. Скорее, они используются для сокращения некоторых определений краев, а также для придания подмножеству всех узлов или краев определенных свойств. Например, DOT-графыдиграфподграф— [gt]c}е]диграф— [
  • Идентификаторы подграфов относятся к подграфам, определенным ранее в описании графа. Неопределенные подграфы ведут себя как пустые подграфы. Это такое же поведение, как и у GraphViz.

Future Work

  • Передача портовой информации в BGL.
  • Расширение кодов побега так же, как это делает GraphViz.
  • Поддержка факультативного признания подграфов как отдельных сущностей.

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




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



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


реклама


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

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