Biblioteca de plantillas iterativas | |
---|---|
Tipo de | Biblioteca |
Desarrollador | Laboratorio de sistemas abiertos |
Escrito en | C++ |
Sistema operativo | Software multiplataforma |
ultima versión | 4.0.0 ( 26 de octubre de 2001 ) |
Licencia | Software semi-libre [1] |
Sitio web | osl.iu.edu/research/itl/ |
Iterative Template Library (ITL) es una biblioteca de componentes diseñada para aplicar métodos numéricos iterativos para manipular objetos de álgebra lineal .
ITL consta de dos grupos funcionales. El primer grupo es una colección de métodos iterativos complejos que utilizan algoritmos básicos de álgebra lineal implementados en paquetes especializados como Matrix Template Library (MTL) o Blitz++ . El segundo grupo es un conjunto de algoritmos de preacondicionamiento diseñados específicamente para trabajar con MTL.
La biblioteca ITL utiliza interfaces abstractas para operaciones de matriz - vector , vector-vector y vector- escalar , lo que le permite utilizar su implementación de forma transparente en bibliotecas de terceros.
Esta biblioteca fue creada en Open Systems Lab , un laboratorio de investigación de la Universidad de Indiana , como parte de MTL.
Se publicó por primera vez por separado de MTL el 25 de julio de 2000 . El nuevo lanzamiento incluía, entre otras cosas, varias interfaces para BLAS y Blitz++.
En la última versión (4.0.0), la biblioteca se descompuso en tres áreas funcionales: métodos para trabajar con el subespacio de Krylov ; condiciones previas e interfaces. Los métodos para trabajar con el subespacio de Krylov son básicos y su uso no está limitado por bibliotecas estándar que implementan objetos de álgebra lineal. Las interfaces están diseñadas para usarse en algoritmos iterativos del subespacio de Krylov de las operaciones básicas de álgebra lineal, implementadas en bibliotecas de terceros, como: MTL, Blitz++. Las condiciones previas se implementan solo para trabajar con la biblioteca MTL.
Además, se incluyeron interfaces experimentales en esta versión para admitir la computación paralela .
Las ideas establecidas en ITL se han continuado y desarrollado en el proyecto Iterative Eigensolver Template Library (IETL) [2] .
Los principios de la programación genérica , dentro de los cuales se creó la biblioteca, [3] implican la simplificación de las interfaces. Esto ha provocado que los algoritmos de ITL parezcan algún tipo de pseudocódigo . Al menos en comparación con otras implementaciones de los mismos algoritmos. Por ejemplo, la implementación del método del gradiente conjugado se vería así:
/* operaciones requeridas: mult,copy,dot_conj,add,scaled */ plantilla < clase Matriz , clase VectorX , clase VectorB , clase Preacondicionador , clase Iteración > int cg ( const Matrix & A , VectorX & x , const VectorB & b , const Preconditioner & M , Iteration & iter ) { typedef VectorX TmpVec ; typename itl_traits < VectorX >:: value_type rho ( 0 ), rho_1 ( 0 ), alpha ( 0 ), beta ( 0 ); TmpVec p ( tamaño ( x )), q ( tamaño ( x )), r ( tamaño ( x )), z ( tamaño ( x )); itl :: mult ( A , itl :: escalado ( x , -1.0 ), b , r ); while ( ! iter . terminado ( r )) { itl :: resolver ( M , r , z ); rho = itl :: dot_conj ( r , z ); if ( iter.primero ( ) ) itl :: copiar ( z , p ); más { beta = rho / rho_1 ; itl :: add ( z , itl :: escalado ( p , beta ), p ); } itl :: multi ( A , p , q ); alfa = rho / itl :: dot_conj ( p , q ); itl :: add ( x , itl :: escalado ( p , alpha ), x ); itl :: add ( r , itl :: escalado ( q , - alpha ), r ); rho_1 = rho ; ++ iterar ; } devolver iter . código_error (); }