METIS在VS2017下的C++调用

METIS在VS2017下的C++调用

    • METIS
    • 安装步骤
    • ``METIS_PartGraphKway()``的使用
    • 小节
    • 参考

METIS

METIS是一个图分割库(graph partitioning)。

安装步骤

  1. 下载METIS:最新METIS版本(5.1.0)。
  2. 用cmake-GUI编译:下载CMake,Browse Source选择源代码文件,Generate选择VS版本,以及生成项目的文件夹,生成METIS.sln
  3. rint()重定义问题:在metis\GKlib\gk_arch中删除,#define rint(x) ((idx_t)((x)+0.5))。(我把metis\programs\metsbin.hmetis\libmetis\metislib.h中也删了)。
  4. 生成metis.lib:点击METIS.sln打开项目,选择relase,按F7生成解决方案,metis.lib在同一目录的"libmetis\Release"中(以上内容在BUILD-Windows.txt中)。
  5. 在项目中配置好metis.lib(第4步生成),以及metis.h(在下载的metis-5.1.0\include中),配置方式见参考三。

METIS_PartGraphKway()的使用

//  图结构
//  0 --- 1 --- 2
//  |     |     |
//  3 --- 4 --- 5
//  
int func(){
	using namespace std;
	idx_t nVertices = 6; // 节点数
	idx_t nEdges = 7;    // 边数
	idx_t nWeights = 1;  //
	idx_t nParts = 2;    // 子图个数
	idx_t objval;      
	std::vector<idx_t> part(nVertices, 0);

	// 每个节点在邻接绝阵中的下标位置
	// 0的邻居信息从adjncy[0]开始;1从adjncy[2]的开始...
	std::vector<idx_t> xadj = { 0,2,5,7,9,12,14 };

	// 每个点邻居的邻接矩阵,是连续存贮的
	// 1,3是0的邻居;0,4,2是1的邻居...
	std::vector<idx_t> adjncy = { 1,3,0,4,2,1,5,0,4,3,1,5,4,2 };

	// 边的权重,如果一样设置成NULL(0)
	std::vector<idx_t> vwgt(nVertices * nWeights, 0);

	int ret = METIS_PartGraphKway(&nVertices, &nWeights, xadj.data(), adjncy.data(),
		NULL, NULL, NULL, &nParts, NULL,
		NULL, NULL, &objval, part.data());

	std::cout << ret << std::endl;

	for (unsigned part_i = 0; part_i < part.size(); part_i++) {
		std::cout << part_i << " " << part[part_i] << std::endl;
	}
}
  • 图的存储方式为CSR(section 5.5)。
  • 具体api每个参数的定义在manual.pdf(section 5.8)。

小节

我他妈的真是个废物一篇论文写写写不完。但成功#include的那一刻,还是有些许自豪。

参考

  1. METIS的wiki介绍
  2. METIS在Win10下的python调用:我没有修改注册表,也没装GCC。
  3. 在VS build METIS时的rint()问题 :其实删第一个文件的定义就好。
  4. VS2017配置.lib:依赖设置,附加依赖项和附加库目录三部分。
  5. 例程error C2131考虑使用c++11的vector
  6. 同一个例程带详细注释

你可能感兴趣的:(一些库的使用,c++,windows)