Większość mojego programowania to jednorazowe kody badawcze w C na własny użytek. Nigdy nie rozpowszechniałem żadnego kodu poza bliskimi współpracownikami. Opracowałem algorytm, który publikuję w czasopiśmie naukowym. Chcę podać kod źródłowy i być może kod wykonywalny w internetowym suplemencie do artykułu. Kolega poprosił mnie o uogólnienie algorytmu, który wymagał ode mnie pisania w C ++ (ack!) I który wymaga rozwiązania małych gęstych układów liniowych. Jeśli uda mi się zdobyć bazę użytkowników dla algorytmu, będzie to częściowo spowodowane tym, że pasek wprowadzania do korzystania z niego jest niski (jak na podłodze). Potencjalni użytkownicy nie będą instalować bibliotek itp. W celu korzystania z kodu. Chcę, aby kod był w pełni samodzielny i nie był obciążony żadną licencją. Mógłbym po prostu napisać własny solver, biorąc coś z Goluba i van Loana, ale wolałbym użyć waniliowego solvera, który napisał już ktoś inny, jeśli taki istnieje. Sugestie docenione. Dzięki!
źródło
Odpowiedzi:
Sugerowałbym dokładnie skopiować interfejs Lapacka do funkcji, której potrzebujesz, najprawdopodobniej potrzebujesz
dgesv
. W ten sposób ludzie, którzy mają zainstalowany Lapack, mogą po prostu połączyć się z nim i po prostu będzie działać. Dla osób, które nie mają zainstalowanego Lapacka, udostępniasz własną prostą implementację tej funkcji lub ewentualnie implementujesz ją za pomocą Eigen lub FLENS, jak sugerują inni.W krainie Fortran biblioteka Lapacka jest takim standardem, że większość ludzi po prostu z niej korzysta i to wszystko, zamiast udostępniać własne implementacje.
źródło
Bardzo wczesnym błędem popełnianym przez wiele osób przy rozpoczynaniu pracy w środowisku naukowym jest założenie, że musisz napisać cały kod w tym samym języku. Myślę, że dzieje się tak głównie z przyczyn historycznych, kiedy nie było jasne, jak zmusić skompilowane programy do komunikowania się ze sobą nawet w różnych wersjach tego samego kompilatora. To powiedziawszy, w tym przypadku, jeśli i tak zamierzasz używać C ++, istnieje kilka bardzo dobrych bibliotek szablonów tylko w C ++, które mogą pasować do twoich potrzeb.
Ponieważ rozpowszechniasz swój kod ze względów akademickich i chciałbyś osadzić w swoim programie gęsty solver algebry liniowej, zdecydowanie zalecamy rozważenie Eigen . Eigen jest licencjonowany na licencji publicznej Mozilla i jest biblioteką tylko nagłówków. Oznacza to, że możesz dystrybuować Eigen ze swoim kodem w formie źródłowej (nie nakłada to żadnych ograniczeń licencyjnych na Twój kod), a otrzymasz dostęp do jego ogólnych możliwości, w tym wyjątkowo wydajnych gęstych liniowych solverów. Jak wspomina GertVdE, masz kilka innych opcji .
źródło
Jeśli potrzebujesz niezawodnego rozwiązania dla układów równań liniowych, poleciłbym FLENS . Zawiera dokładną ponowną implementację LAPACK (odtwarza nawet te same błędy zaokrągleń, co LAPACK, jeśli używana jest jednowątkowa implementacja BLAS). Dotyczy to wszystkich funkcji FLENS-LAPACK (wraz z funkcjami narzędziowymi około 100 procedur).
FLENS jest objęty licencją BSD, a zatem pozwala na włączenie do produktów zastrzeżonych.
FLENS jest tylko nagłówkiem i jeśli potrzebujesz tylko podzestawu FLENS, mogę dać ci uproszczoną wersję zawierającą tylko te funkcje, których potrzebujesz. FLENS ma własną referencyjną implementację BLAS. Ale opcjonalnie użytkownicy mogą łączyć się ze zoptymalizowanymi bibliotekami BLAS, takimi jak ATLAS, OpenBLAS lub GotoBALS. W przypadku dużych matryc daje to wzrost wydajności o około 40% w porównaniu do Eigen.
I tak, Eigen używa również zestawu testów LAPACK do sprawdzania ich wyników. Robią to dla 3 funkcji (Lu, Cholesky i Wartości własne / wektory macierzy symetrycznej). Jednak ich obliczenie wartości / wektorów własnych macierzy niesymetrycznej zawiódłoby zestaw testów LAPACK.
Oświadczenie: Tak, FLENS to moje dziecko! Oznacza to, że kodowałem około 95%, a każda linia kodu była tego warta.
źródło