La plupart de mes programmes sont des codes de recherche uniques en C pour mon propre usage. Je n'ai jamais distribué de code à des collaborateurs proches. J'ai développé un algorithme que je publie dans une revue scientifique. Je veux fournir le code source et peut-être le code exécutable dans le supplément en ligne de l'article. Un collègue m'a demandé de faire une généralisation à l'algorithme qui m'a obligé à écrire en C ++ (ack!) Et qui nécessite de résoudre de petits systèmes linéaires denses. Si je réussis à obtenir une base d'utilisateurs pour l'algorithme, ce sera en partie parce que la barre d'entrée pour l'utiliser est faible (comme au sol). Les utilisateurs potentiels n'installeront pas de bibliothèques, etc. pour utiliser le code. Je veux que le code soit entièrement autonome et libre de toute licence. Je pourrais simplement écrire mon propre solveur en retirant quelque chose de Golub et van Loan mais je préfère utiliser un solveur vanille que quelqu'un d'autre a déjà écrit s'il y en a. Suggestions appréciées. Merci!
9
Réponses:
Je suggérerais de dupliquer exactement l'interface Lapack avec la fonction dont vous avez besoin, probablement vous avez juste besoin
dgesv
. De cette façon, les personnes qui ont installé Lapack peuvent simplement s'y connecter et cela fonctionnera simplement. Pour les personnes qui n'ont pas installé Lapack, vous fournissez votre propre implémentation simple de cette fonction, ou éventuellement l'implémentez en utilisant Eigen ou FLENS comme d'autres l'ont suggéré.Dans le pays de Fortran, la bibliothèque Lapack est un tel standard, que la plupart des gens l'utilisent simplement et c'est tout, au lieu de fournir leurs propres implémentations.
la source
Une erreur très précoce que beaucoup de gens commettent en se lançant dans l'informatique scientifique suppose que vous devez écrire tout votre code dans le même langage. Je pense que cela est dû en grande partie à des raisons historiques, quand il n'était pas clair comment faire communiquer les programmes compilés entre eux à travers des versions paires du même compilateur. Cela dit, dans ce cas, si vous utilisez de toute façon C ++, il existe plusieurs très bonnes bibliothèques de modèles en-tête C ++ qui pourraient répondre à vos besoins.
Comme vous distribuez votre code pour des raisons académiques et que vous souhaitez intégrer un solveur d'algèbre linéaire dense dans votre code, je vous recommande fortement de considérer Eigen . Eigen est sous licence Mozilla Public License et est une bibliothèque uniquement en-tête. Cela signifie que vous pouvez distribuer Eigen avec votre code sous forme source (cela n'impose aucune restriction de licence à votre code) et vous aurez accès à ses capacités générales, y compris des solveurs linéaires denses extrêmement efficaces. Comme le mentionne GertVdE, vous avez plusieurs autres options .
la source
Si vous voulez un solveur fiable pour les systèmes d'équations linéaires, je recommanderais FLENS . Il contient une réimplémentation exacte de LAPACK (il reproduit même les mêmes erreurs d'arrondi que LAPACK si une implémentation BLAS à un seul thread est utilisée). Cela est vrai pour toutes les fonctions FLENS-LAPACK (avec les fonctions utilitaires environ 100 routines).
FLENS est sous licence BSD et permet donc d'être intégré dans des produits propriétaires.
FLENS est uniquement en-tête et si vous n'avez besoin que d'un sous-ensemble de FLENS, je peux vous donner une version allégée contenant uniquement les fonctions dont vous avez besoin. FLENS est livré avec sa propre implémentation BLAS de référence. Mais en option, vos utilisateurs peuvent se lier à des bibliothèques BLAS optimisées comme ATLAS, OpenBLAS ou GotoBALS. Pour les grandes matrices, cela donne un gain de performances d'environ 40% par rapport à Eigen.
Et oui, Eigen utilise également la suite de tests LAPACK pour vérifier leurs résultats. Ils le font pour 3 fonctions (Lu, Cholesky et Eigenvalues / -vectors d'une matrice symétrique). Cependant, leur calcul des valeurs / vecteurs propres d'une matrice non symétrique échouerait à la suite de tests LAPACK.
Avertissement: Oui, FLENS est mon bébé! Cela signifie que j'en ai codé environ 95% et que chaque ligne de code en valait la peine.
la source