Der größte Teil meiner Programmierung besteht aus einmaligen Forschungscodes in C für meinen eigenen Gebrauch. Ich habe niemals Code an andere als enge Mitarbeiter verteilt. Ich habe einen Algorithmus entwickelt, den ich in einer wissenschaftlichen Zeitschrift veröffentliche. Ich möchte den Quellcode und möglicherweise den ausführbaren Code in der Online-Ergänzung zum Artikel bereitstellen. Ein Kollege forderte mich auf, eine Verallgemeinerung des Algorithmus vorzunehmen, bei der ich in C ++ schreiben musste (ack!) Und bei der ich kleine dichte lineare Systeme lösen muss. Wenn es mir gelingt, eine Benutzerbasis für den Algorithmus zu erhalten, liegt dies teilweise daran, dass die Eingabeleiste für die Verwendung niedrig ist (wie auf dem Boden). Potenzielle Benutzer installieren keine Bibliotheken usw., um den Code zu verwenden. Ich möchte, dass der Code vollständig eigenständig ist und überhaupt nicht durch eine Lizenz belastet wird. Ich könnte einfach meinen eigenen Löser schreiben, indem ich etwas aus Golub und van Loan herausnehme, aber ich würde lieber einen Vanille-Löser verwenden, den bereits jemand anderes geschrieben hat, wenn es einen gibt. Vorschläge geschätzt. Vielen Dank!
quelle
Antworten:
Ich würde vorschlagen, die Lapack-Oberfläche genau auf die Funktion zu duplizieren, die Sie benötigen, höchstwahrscheinlich nur
dgesv
. Auf diese Weise können Personen, auf denen Lapack installiert ist, einfach eine Verknüpfung herstellen, und es funktioniert einfach. Für Personen, auf denen Lapack nicht installiert ist, stellen Sie Ihre eigene einfache Implementierung dieser Funktion bereit oder implementieren sie möglicherweise mit Eigen oder FLENS, wie von anderen vorgeschlagen.Im Fortran-Land ist die Lapack-Bibliothek ein solcher Standard, dass die meisten Leute sie einfach verwenden und das ist es, anstatt ihre eigenen Implementierungen bereitzustellen.
quelle
Ein sehr früher Fehler, den viele Menschen machen, wenn sie mit dem wissenschaftlichen Rechnen beginnen, ist die Annahme, dass Sie Ihren gesamten Code in derselben Sprache schreiben müssen. Ich denke, dies ist größtenteils auf historische Gründe zurückzuführen, als nicht klar war, wie kompilierte Programme über gleichmäßige Versionen desselben Compilers hinweg miteinander kommunizieren können. In diesem Fall gibt es jedoch mehrere sehr gute Vorlagenbibliotheken nur für C ++ - Header, die möglicherweise Ihren Anforderungen entsprechen, wenn Sie C ++ trotzdem verwenden möchten.
Da Sie Ihren Code aus akademischen Gründen verteilen und einen dichten linearen Algebra-Solver in Ihren Code einbetten möchten, würde ich Ihnen dringend empfehlen, Eigen in Betracht zu ziehen . Eigen wurde unter der Mozilla Public License lizenziert und ist eine reine Header-Bibliothek. Dies bedeutet, dass Sie Eigen mit Ihrem Code in Quellform verteilen können (dies legt keine Lizenzbeschränkungen für Ihren Code fest), und Sie erhalten Zugriff auf seine allgemeinen Funktionen, einschließlich äußerst effizienter dichter linearer Löser. Wie GertVdE erwähnt, haben Sie mehrere andere Möglichkeiten .
quelle
Wenn Sie einen zuverlässigen Löser für lineare Gleichungssysteme suchen, würde ich FLENS empfehlen . Es enthält eine genaue Neuimplementierung von LAPACK (es reproduziert sogar die gleichen Rundungsfehler wie LAPACK, wenn eine BLAS-Implementierung mit einem Thread verwendet wird). Dies gilt für alle FLENS-LAPACK- Funktionen (zusammen mit den Utility-Funktionen ca. 100 Routinen).
FLENS steht unter einer BSD-Lizenz und kann daher in proprietäre Produkte integriert werden.
FLENS ist nur ein Header und wenn Sie nur eine Teilmenge von FLENS benötigen, kann ich Ihnen eine abgespeckte Version geben, die nur die Funktionen enthält, die Sie benötigen. FLENS wird mit einer eigenen Referenz-BLAS-Implementierung geliefert. Optional können Ihre Benutzer jedoch Links zu optimierten BLAS-Bibliotheken wie ATLAS, OpenBLAS oder GotoBALS erstellen. Bei großen Matrizen ergibt sich ein Leistungsgewinn von ca. 40% gegenüber Eigen.
Und ja, Eigen verwendet auch die LAPACK-Testsuite, um ihre Ergebnisse zu überprüfen. Sie tun dies für 3 Funktionen (Lu, Cholesky und Eigenwerte / -vektoren einer symmetrischen Matrix). Ihre Berechnung von Eigenwerten / -vektoren einer nicht symmetrischen Matrix würde jedoch die LAPACK-Testsuite nicht bestehen.
Haftungsausschluss: Ja, FLENS ist mein Baby! Das heißt, ich habe ungefähr 95% davon codiert und jede Codezeile hat sich gelohnt.
quelle