La mayor parte de mi programación son códigos de investigación únicos en C para mi propio uso. Nunca he distribuido ningún código a otros que no sean colaboradores cercanos. He desarrollado un algoritmo que estoy publicando en una revista científica. Quiero proporcionar el código fuente y quizás el código ejecutable en el suplemento en línea del artículo. Un colega me pidió que hiciera una generalización del algoritmo que me requería escribir en C ++ (¡ack!) Y que requiere que resuelva pequeños sistemas lineales densos. Si logro obtener una base de usuarios para el algoritmo, será en parte debido a que la barra de entrada para usarlo es baja (como en el piso). Los usuarios potenciales no instalarán bibliotecas, etc. para usar el código. Quiero que el código sea completamente independiente y no esté afectado por ninguna licencia. Simplemente podría escribir mi propio solucionador sacando algo de Golub y van Loan, pero prefiero usar un solucionador de vainilla que alguien más ya haya escrito si hay alguno por ahí. Sugerencias apreciadas. ¡Gracias!
fuente
Respuestas:
Sugeriría duplicar exactamente la interfaz de Lapack a la función que necesita, lo más probable es que solo necesite
dgesv
. De esa manera, las personas que tienen instalado Lapack pueden simplemente conectarse a él y simplemente funcionará. Para las personas que no tienen instalado Lapack, puede proporcionar su propia implementación simple de esta función, o posiblemente implementarla utilizando Eigen o FLENS como otros sugirieron.En la tierra de Fortran, la biblioteca Lapack es un estándar tal, que la mayoría de la gente simplemente la usa y eso es todo, en lugar de proporcionar sus propias implementaciones.
fuente
Un error muy temprano que muchas personas cometen al iniciarse en la informática científica es asumir que necesita escribir todo su código en el mismo idioma. Creo que esto se debe en gran medida a razones históricas, cuando no estaba claro cómo hacer que los programas compilados se comuniquen entre sí a través de versiones pares del mismo compilador. Dicho esto, en este caso, si va a usar C ++ de todos modos, hay varias bibliotecas de plantillas de encabezado de C ++ muy buenas que pueden satisfacer sus necesidades.
Dado que está distribuyendo su código por razones académicas, y desea incorporar un solucionador de álgebra lineal denso en su código, le recomiendo encarecidamente que considere Eigen . Eigen ha sido licenciado bajo la Licencia pública de Mozilla y es una biblioteca de solo encabezado. Esto significa que puede distribuir Eigen con su código en forma de fuente (esto no impone ninguna restricción de licencia en su código), y recibirá acceso a sus capacidades generales, incluidos los solucionadores lineales densos extremadamente eficientes. Como menciona GertVdE, tiene varias otras opciones .
fuente
Si desea un solucionador confiable para sistemas de ecuaciones lineales, recomendaría FLENS . Contiene una reimplementación exacta de LAPACK (incluso reproduce los mismos errores de redondeo que LAPACK si se usa una implementación BLAS de un solo subproceso). Esto es cierto para todas las funciones FLENS-LAPACK (junto con las funciones de utilidad de aproximadamente 100 rutinas).
FLENS está bajo una licencia BSD y, por lo tanto, permite incorporarse a productos patentados.
FLENS es solo encabezado y si solo necesita un subconjunto de FLENS, puedo darle una versión simplificada que contiene solo las funciones que necesita. FLENS viene con su propia implementación BLAS de referencia. Pero, opcionalmente, sus usuarios pueden vincularse con bibliotecas BLAS optimizadas como ATLAS, OpenBLAS o GotoBALS. Para matrices grandes, esto proporciona una ganancia de rendimiento de aproximadamente el 40% en comparación con Eigen.
Y sí, Eigen también usa el paquete de pruebas LAPACK para verificar sus resultados. Lo hacen para 3 funciones (Lu, Cholesky y Eigenvalues / -vectors de una matriz simétrica). Sin embargo, su cálculo de valores / vectores propios de una matriz no simétrica fallaría en el conjunto de pruebas LAPACK.
Descargo de responsabilidad: Sí, FLENS es mi bebé! Eso significa que codifiqué alrededor del 95% y cada línea de código valió la pena.
fuente