Installation et Configuration de SuiteSparse-Metis pour Windows 1.3.1

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

  1. Ajoutez le chemin d'installation de SuiteSparse dans les variables d'environnement sous le nom SuiteSparse\_DIR. Par exemple, si SuiteSparse est installé dans C:\\Program Files (x86)\\SuiteSparse, définissez SuiteSparse\_DIR=C:\\Program Files (x86)\\SuiteSparse.
  2. 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;
}

  1. Dans le même répertoire, créez un fichier CMakeLists.txt pour 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})

  1. Créez un dossier nommé src et placez-y les deux fichiers précédents. Ensuite, créez un dossier build et utilisez CMake pour générer les fichiers de projet Visual Studio 2013.
  2. 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

Étiquettes: suiteSparse metis VisualStudio2013 CMake Eigen

Publié le 3 octobre à 06h29