METIS Input Routines
namespace boost {
namespace graph {
class metis_reader;
class metis_exception;
class metis_input_exception;
class metis_distribution;
}
}
METISпредставляет собой набор программ для разделения графов (среди прочего). Parallel BGL может считывать формат графов METIS и формат разделов, что позволяет легко загружать графы, разделенные METIS, в структуры данных Parallel BGL.
<boost/graph/metis.hpp>
class metis_reader
{
public:
typedef std::size_t vertices_size_type;
typedef std::size_t edges_size_type;
typedef double vertex_weight_type;
typedef double edge_weight_type;
class edge_iterator;
class edge_weight_iterator;
metis_reader(std::istream& in);
edge_iterator begin();
edge_iterator end();
edge_weight_iterator weight_begin();
vertices_size_type num_vertices() const;
edges_size_type num_edges() const;
std::size_t num_vertex_weights() const;
vertex_weight_type vertex_weight(vertices_size_type v, std::size_t n);
bool has_edge_weights() const;
};
Считыватель METIS предоставляет интерфейс итератора для графового файла METIS. Интерфейс итератора наиболее полезен при построении параллельных BGL-графов на лету. Например, следующий код строит графикгиз графа METIS, хранящегося вargv..
std::ifstream in_graph(argv[1]);
metis_reader reader(in_graph);
Graph g(reader.begin(), reader.end(),
reader.weight_begin(),
reader.num_vertices());
Призывыначинаютсяизаканчиваются [].Возврат диапазона итератора для краев в графе; призыв квес_начало()возвращает итератор, который перечислит веса краев на графике. Для распределенного графа распределение будет определяться автоматически графом; для использования раздела METIS см. разделСчитыватель разделов.
metis_reader::edge_iterator
Итератор ввода, который перечисляет края на графике METIS и подходит для использования в качестве.EdgeIteratoradjacency_list.значение_типэтого итератора представляет собой пару вершинных чисел.
metis_reader::edge_weight_iterator
Итератор ввода, который перечисляет крайние веса в графе METIS.значение_типэтого итератора равноedge_weight_type. Если края в графе METIS не взвешенны, результат отсчета этого итератора всегда будет равен нулю.
metis_reader(std::istream& in);
Создает новый считыватель METIS, который будет извлекать края из входного потокав. Если какие-либо ошибки встречаются при первоначальном разборев,metis_input_исключениебудет брошено.
edge_iterator begin();
Возвращает итератор к первому краю файла METIS.
edge_iterator end();
Возвращает итератор один мимо последнего края в файле METIS.
edge_weight_iterator weight_begin();
Возвращает итератор к первому весу края в файле METIS. Весовой итератор следует перемещать совместно с краевым итератором; при движении краевого итератора изменяется вес края. Если края на графике не взвешенны, возвращаемый вес всегда будет равен нулю.
vertices_size_type num_vertices() const;
Возвращает количество вершин в графе.
edges_size_type num_edges() const;
Возвращает количество краев в графе.
std::size_t num_vertex_weights() const;
Возвращает количество весов, прикрепленных к каждой вершине.
vertex_weight_type vertex_weight(vertices_size_type v, std::size_t n);
bool has_edge_weights() const;
Возвращаетистинное, когда края графа имеют весы,ложноеиначе. Когдаложный, итератор веса края все еще действителен, но возвращает ноль для веса каждого края.
class metis_distribution
{
public:
typedef int process_id_type;
typedef std::size_t size_type;
metis_distribution(std::istream& in, process_id_type my_id);
size_type block_size(process_id_type id, size_type) const;
process_id_type operator()(size_type n);
size_type local(size_type n) const;
size_type global(size_type n) const;
size_type global(process_id_type id, size_type n) const;
private:
std::istream& in;
process_id_type my_id;
std::vector<process_id_type> vertices;
};
Классmetis_distributionзагружает файл раздела METIS и делает его доступным в качестве дистрибутива, подходящего для использования сраспределенным списком смежноститипа графа. Для загрузки графа METIS с использованием раздела METIS используйте объектmetis_readerдля графа и объектmetis_distributionдля распределения, как в следующем примере.
std::ifstream in_graph(argv[1]);
metis_reader reader(in_graph);
std::ifstream in_partitions(argv[2]);
metis_distribution dist(in_partitions, process_id(pg));
Graph g(reader.begin(), reader.end(),
reader.weight_begin(),
reader.num_vertices(),
pg,
dist);
В этом примереargvявляется графом, аargvявляется файлом раздела, генерируемымpmetis. Объектdistзагружает информацию о разделении из указанного им входного потока и использует ее для распределения списка смежности. Обратите внимание, что входной поток должен быть в формате файла раздела METIS и должен быть разделен для того же количества процессов, что и в группе процессовpg.
metis_distribution(std::istream& in, process_id_type my_id);
Создает новое распределение METIS из входного потокав.my_idявляется идентификатором процесса текущего процесса в группе процессов, по которой будет распределен график.
size_type block_size(process_id_type id, size_type) const;
Возвращает число вершин, подлежащих хранению в процессеid. Второй параметр,size_type, не используется и может быть любым значением.
process_id_type operator()(size_type n);
Возвращает идентификатор для процесса, который будет хранить вершинный номерn.
size_type local(size_type n) const;
Возвращает локальный индекс вершинного числаnв процессе владения.
size_type global(size_type n) const;
Возвращает идентификатор для процесса, который будет хранить вершинный номерn.
size_type global(process_id_type id, size_type n) const;
Возвращает идентификатор для процесса, который будет хранить вершинный номерn.
Copyright (C) 2005 Попечители Университета Индианы.
Авторы: Дуглас Грегор и Эндрю Лумсдейн