2011-02-08 5 views
6

Où puis-je obtenir un solveur de système linéaire rapide écrit en D? Il devrait être en mesure de prendre une matrice carrée A et un vecteur b et résoudre l'équation Ax = b pour b et, idéalement, effectuer également une inversion explicite sur A. J'en ai un que j'ai écrit moi-même, mais c'est plutôt lent, probablement parce qu'il est complètement naïf dans le cache. Cependant, pour mon cas d'utilisation, je besoin de quelque chose avec les éléments suivants absolus, non négociables exigences, à savoir si elle ne répond pas à ces questions, alors je ne me soucie pas autrement comment bon il en est autrement:Solveur de système linéaire rapide pour D?

  1. Doit être une licence de domaine public, une licence Boost ou une licence permissive similaire. Idéalement, il ne devrait pas nécessiter d'attribution dans les binaires (c'est-à-dire pas BSD), bien que ce point soit quelque peu négociable.

  2. Doit être écrit en langage D pur ou facilement traduisible en D pur. Le code Fortran inscriptible (c'est-à-dire LAPACK) n'est pas une bonne réponse, quelle que soit sa rapidité. Doit être optimisé pour les grands systèmes (c'est-à-dire n> 1000). Je ne veux pas quelque chose qui soit conçu pour les programmeurs de jeux pour résoudre les matrices 4x4 vraiment, vraiment vite. Ne doit pas être inextricablement liée à une énorme bibliothèque de choses dont je n'ai pas besoin.

Edit: La raison de ces exigences apparemment fou est que je besoin de ce code pour une bibliothèque open source sous licence permissive que je ne veux pas avoir de dépendances tiers.

+1

Quelles propriétés A a-t-il? Symétrique? Positif? Définie positive? Bandé? Clairsemé? Vous demandez quelque chose de rapide, domaine public et excluez LAPACK! Il ne semble pas que vous vouliez vraiment une solution! Êtes-vous conscient que tous les solveurs linéaires performants sont dérivés du manuel? –

+0

Qu'est-ce que c'est «The Handbook»? – Baxissimo

+0

@Baxissimo "Le manuel pour le calcul automatique: algèbre linéaire" publié à l'origine en 1972, écrit par JH Wilkinson et C. Reinsch –

Répondre

3

Si vous n'aimez pas le code Fortran, une bibliothèque matricielle C++ dense raisonnablement rapide avec un support multi-cœur modeste, un code bien écrit et une bonne interface utilisateur est Eigen. Il devrait être facile de traduire son code en D (ou d'en extraire des algorithmes).

Et maintenant mon "penser à vos exigences": il y a une raison pour laquelle "tout le monde" (Mathematica, Matlab, Maple, SciPy, GSL, R, ...) utilise ATLAS/LAPACK, UMFPACK, PARDISO, CHOLMOD etc. Il est difficile d'écrire des solveurs matriciels rapides, multi-threads, efficaces en mémoire, portables et numériquement stables (faites-moi confiance, j'ai essayé). Une grande partie de ce travail a été consacrée à ATLAS et le reste. Donc, mon approche serait d'écrire des liaisons pour la bibliothèque concernée en fonction de votre type de matrice, et de lier de D aux interfaces C. Peut-être que les liaisons dans multiarray sont assez (je n'ai pas essayé). Sinon, je suggère de regarder une autre bibliothèque C++, à savoir uBlas et les bindings respectifs pour des idées.

+0

Le problème avec LAPACK, etc. est que j'ai besoin de cela pour une petite section de code et ne veux pas dépendance. De plus, je ne peux pas utiliser Eigen parce que c'est LGPL, donc ma traduction D serait couverte par le copyleft. – dsimcha

+0

@dsimcha: Fait sens.Peut-être que regarder le pivot partiel LU d'Eigen et la source de triangularisation pourrait être utile. Je doute que les algorithmes soient couverts par la LGPL (étant donné qu'ils sont probablement basés sur des recherches universitaires antérieures), mais je ne suis pas avocat. Quant à la dépendance LAPACK: elle peut ne pas être aussi grande qu'elle en a l'air. LAPACK est pré-installé sur OS X, soit pré-installé ou un apt-get sur Unix/Linux, et les binaires Windows sont facilement disponibles. Mais je ne veux pas fouetter un cheval mort ... – stephan

+0

Tout ce que je sais, c'est que je n'ai jamais réussi à faire fonctionner LAPACK sous Windows la dernière fois que j'ai essayé de le faire pour une raison sans rapport. (Je ne me souviens pas des détails.) Peut-être que si je découvre comment, je garderai mes routines D pures et lentes par défaut et ajouterai un drapeau -version = LAPACK donc si vous avez installé LAPACK et besoin de la vitesse, peut l'obtenir. (La performance de ce solveur n'a d'importance que dans le cas relativement inhabituel où N est grand.Pour un petit N, les algorithmes naïfs sont assez rapides.) – dsimcha

Questions connexes