2011-02-08 23 views
6

¿Dónde puedo obtener un solucionador de sistema lineal rápido escrito en D? Debe ser capaz de tomar una matriz cuadrada A y un vector b y resolver la ecuación Ax = b para b e, idealmente, también realizar la inversión explícita sobre A. Tengo uno que escribí yo mismo, pero es bastante lento, probablemente porque es completamente ingenuo. Sin embargo, para mi caso de uso, necesito algo con los siguientes absolutos y no negociables requisitos, es decir, si no cumple con estos, entonces no importa lo contrario de lo bueno que es lo contrario:Solucionador de sistema lineal rápido para D?

  1. Debe tener licencia de dominio público, licencia de Boost o alguna licencia permisiva similar. Idealmente, no debería requerir atribución en binarios (es decir, no BSD), aunque este punto es algo negociable.

  2. Debe estar escrito en D puro o traducirse fácilmente a puro D. El código Fortran inescrutable (es decir, LAPACK) no es una buena respuesta, sin importar qué tan rápido sea.

  3. Debe estar optimizado para sistemas grandes (es decir, n> 1000). No quiero que algo diseñado para programadores de juegos resuelva matrices 4x4 realmente, muy rápido.

  4. No debe estar inextricablemente vinculado a una enorme biblioteca de cosas que no necesito.

Editar: La razón de estos requisitos aparentemente locos es que necesito el código para una biblioteca de código abierto con licencia permisiva que no quiere tener ninguna dependencia de terceros.

+1

¿Qué propiedades tiene A? ¿Simétrico? ¿Positivo? ¿Positivo definitivo? ¿Bandas? ¿Escaso? ¡Solicitas algo rápido, dominio público y excluyes LAPACK! ¡No parece que realmente quieras una solución! ¿Sabe que todos los solucionadores lineales de rendimiento se derivan de The Handbook? –

+0

¿Qué es "El manual"? – Baxissimo

+0

@Baxissimo "The Handbook for Automatic Computation: Linear Algebra" publicado originalmente en 1972, escrito por JH Wilkinson y C. Reinsch –

Respuesta

3

Si no te gusta el código de Fortran, una biblioteca de matriz densa de C++ razonablemente rápida con compatibilidad modesta multi-core, código bien escrito y una buena interfaz de usuario es Eigen. Debería ser sencillo traducir su código a D (o tomar algunos algoritmos de él).

Y ahora mi "pensar en sus requisitos": hay una razón por la cual "todos" (Mathematica, Matlab, Maple, SciPy, GSL, R, ...) utiliza ATLAS/LAPACK, UMFPACK, PARDISO, CHOLMOD, etc. Es difícil escribir soluciones de matriz rápidas, multihilo, de memoria eficiente, portátiles y numéricamente estables (créeme, lo he intentado). Mucho de este arduo trabajo se ha dedicado a ATLAS y al resto.

Así que mi enfoque sería escribir enlaces para la biblioteca relevante según el tipo de matriz y vincular desde D a las interfaces C. Tal vez los enlaces en multiarray son suficientes (no lo he intentado). De lo contrario, sugeriría buscar en otra biblioteca de C++, a saber, uBlas y las respectivas bindings para obtener ideas.

+0

El problema con LAPACK, etc. es que necesito esto para una pequeña sección de código y no quiero un dependencia. Además, no puedo usar Eigen porque es LGPL, por lo que mi traducción D estaría cubierta por el copyleft. – dsimcha

+0

@dsimcha: Tiene sentido.Tal vez mirar la LU de pivote parcial de Eigen y la fuente de triangularización podría ser útil. Dudo que los algoritmos estén cubiertos por la LGPL (dado que probablemente se basen en investigaciones académicas previas), pero no soy abogado. En cuanto a la dependencia de LAPACK: puede que no sea tan grande como parece. LAPACK está preinstalado en OS X, ya sea preinstalado o uno que se puede escaparse en Unix/Linux, y los binarios de Windows están disponibles. Pero no quiero azotar a un caballo muerto ... – stephan

+0

Todo lo que sé es que nunca logré que LAPACK funcionara en Windows la última vez que lo intenté por un motivo no relacionado. (No recuerdo los detalles.) Tal vez si descubro cómo, mantendré mis rutinas D lentas como predeterminadas y agrego una bandera -version = LAPACK así que si tienes instalado LAPACK y necesitas la velocidad, puede obtenerlo (El rendimiento de este solucionador solo importa en el caso relativamente inusual de que N sea grande. Para N pequeños, los algoritmos ingenuos son lo suficientemente rápidos.) – dsimcha

Cuestiones relacionadas