L'installation package suiteSparse-metis-for-windows 1.3.1 comprend SuiteSparse 4.5.1, Metis 5.1.0 et LAPACK 3.4.1. Ce package est disponible sur GitHub avec des instructions d'installation détaillées, bien que quelques bugs puissent être rencontrés.
Bug 1: Dans le fichier metis/GKlib/gk\_arch.h, il existe un problème car la fonction rint est maintenant suportée par les bibliothèques standard C++ à partir de C++11, et Visual Studio 2013 la prend en charge également. Voici comment corriger ce problème :
#ifdef _MSC_VER
/* Visual Studio ne possède pas la fonction rint() */
#if (_MSC_VER < 1800) /* Version du compilateur Visual Studio 2013 */
#define rint(x) ((int)((x)+0.5))
#endif
/* Visual Studio ne définit pas INFINITY */
#ifndef INFINITY
#define INFINITY FLT_MAX
#endif
#endif
Bug 2: Si vous rencontrez des problèmes lors de la génération des bibliothèques dynamiques, commencez par générer les bibliothèques statiques avant de passer à la génération des bibliothèques dynamiques.
Bug 3: Lors de la génération des bibliothèques dynamiques, certains projets exécutables utilisent metis.lib, qui doit être généré en tant que bibliothèque statique pour éviter des erreurs de compilation.
Test de l'installation
- Ajoutez le chemin d'installation de SuiteSparse dans les variables d'environnement sous le nom
SuiteSparse\_DIR. Par exemple, si SuiteSparse est installé dansC:\\Program Files (x86)\\SuiteSparse, définissezSuiteSparse\_DIR=C:\\Program Files (x86)\\SuiteSparse. - Créez un programme de test pour vérifier l'installation.
#include <iostream>
#include <Eigen/Eigen>
#include <Eigen/SPQRSupport>
using namespace Eigen;
int main() {
SparseMatrix<double> matrice(4, 4);
std::vector<Triplet<double>> elementsNonNuls;
// Initialisation des éléments non nuls
int lignes[3] = {0, 1, 2};
int colonnes[3] = {1, 2, 2};
double valeurs[3] = {6.1, 7.2, 8.3};
for (int i = 0; i < 3; ++i)
elementsNonNuls.push_back(Triplet<double>(lignes[i], colonnes[i], valeurs[i]));
// Initialisation de la matrice creuse
matrice.setFromTriplets(elementsNonNuls.begin(), elementsNonNuls.end());
std::cout << "Matrice = \n" << matrice << std::endl;
// Exemple de décomposition QR
SPQR<SparseMatrix<double>> decompositionQR;
// Calcul de la décomposition
decompositionQR.compute(matrice);
// Résolution d'un système linéaire Ax = b
Vector4d vecteurB(1, 2, 3, 4);
Vector4d vecteurX = decompositionQR.solve(vecteurB);
std::cout << "Solution x = \n" << vecteurX << std::endl;
std::cout << "Matrice * Solution = \n" << matrice * vecteurX << std::endl;
getchar();
return 0;
}
- Dans le même répertoire, créez un fichier
CMakeLists.txtpour configurer le projet.
# Script CMake pour construire avec SuiteSparse
# http://code.google.com/p/suitesparse-metis-for-windows/
# Créé par Jose Luis Blanco (Université d'Almeria) 2013
# Mis à jour par jesnault (jerome.esnault@inria.fr) 2014-01-21
PROJECT(TestSuiteSparse)
cmake_minimum_required(VERSION 2.8)
# Détecter les bibliothèques SuiteSparse :
# Si elles ne sont pas trouvées automatiquement, définir SuiteSparse_DIR dans CMake au répertoire où SuiteSparse a été construit.
LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/../../cmakemodule/") # Ajoutez le répertoire où se trouve le module FindSuiteSparse.cmake.
set(SuiteSparse_USE_LAPACK_BLAS ON)
find_package(SuiteSparse QUIET NO_MODULE) # 1ère tentative : localiser le fichier *config.cmake.
if(NOT SuiteSparse_FOUND)
#set(SuiteSparse_VERBOSE ON)
find_package(SuiteSparse REQUIRED) # 2ème tentative : utiliser le module FindSuiteSparse.cmake
include_directories(${SuiteSparse_INCLUDE_DIRS})
else()
message(STATUS "SuiteSparse trouvé : include(${USE_SuiteSparse})")
include(${USE_SuiteSparse})
endif()
MESSAGE(STATUS "SuiteSparse_LIBS: ${SuiteSparse_LIBRARIES}")
# Déclarer un exemple de programme :
ADD_EXECUTABLE(test-suite-sparse test-suite-sparse.cpp)
TARGET_LINK_LIBRARIES(test-suite-sparse ${SuiteSparse_LIBRARIES})
- Créez un dossier nommé
srcet placez-y les deux fichiers précédents. Ensuite, créez un dossierbuildet utilisez CMake pour générer les fichiers de projet Visual Studio 2013. - Si vous ne souhaitez pas utiliser CMake, assurez-vous de définir le chemin d'installation des bibliothèques LAPACK et SuiteSparse dans les propriétés du projet Visual Studio et de lier les bibliothèques suivantes :
C:\Program Files (x86)\SuiteSparse\lib64\metisd.lib
C:\Program Files (x86)\SuiteSparse\lib\suitesparseconfigd.lib
C:\Program Files (x86)\SuiteSparse\lib\libamdd.lib
C:\Program Files (x86)\SuiteSparse\lib\libbtfd.lib
C:\Program Files (x86)\SuiteSparse\lib\libcamdd.lib
C:\Program Files (x86)\SuiteSparse\lib\libccolamdd.lib
C:\Program Files (x86)\SuiteSparse\lib\libcolamdd.lib
C:\Program Files (x86)\SuiteSparse\lib\libcholmodd.lib
C:\Program Files (x86)\SuiteSparse\lib\libcxsparsed.lib
C:\Program Files (x86)\SuiteSparse\lib\libklud.lib
C:\Program Files (x86)\SuiteSparse\lib\libldld.lib
C:\Program Files (x86)\SuiteSparse\lib\libumfpackd.lib
C:\Program Files (x86)\SuiteSparse\lib\libspqrd.lib
C:\Program Files (x86)\SuiteSparse\lib\lapack_blas_windows\libblas.lib
C:\Program Files (x86)\SuiteSparse\lib\lapack_blas_windows\liblapack.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
comdlg32.lib