Biblioteca de șabloane iterative | |
---|---|
Tip de | Bibliotecă |
Dezvoltator | Laboratorul de sisteme deschise |
Scris in | C++ |
Sistem de operare | Software multiplatformă |
ultima versiune | 4.0.0 ( 26 octombrie 2001 ) |
Licență | Software semi-liber [1] |
Site-ul web | osl.iu.edu/research/itl/ |
Iterative Template Library (ITL) este o bibliotecă de componente concepute pentru a aplica metode numerice iterative pentru a manipula obiecte de algebră liniară .
ITL este format din două grupuri funcționale. Primul grup este o colecție de metode iterative complexe care utilizează algoritmi de algebră liniară de bază implementați în pachete specializate, cum ar fi Matrix Template Library (MTL) sau Blitz++ . Al doilea grup este un set de algoritmi de precondiționare proiectați special pentru lucrul cu MTL.
Biblioteca ITL folosește interfețe abstracte pentru operații matrice - vector , vector-vector și vector- scalar , ceea ce vă permite să utilizați în mod transparent implementarea lor în biblioteci terțe.
Această bibliotecă a fost creată la Open Systems Lab , un laborator de cercetare de la Universitatea Indiana , ca parte a MTL.
A fost publicat pentru prima dată separat de MTL pe 25 iulie 2000 . Noua versiune a inclus, printre altele, mai multe interfețe pentru BLAS și Blitz++.
În cea mai recentă versiune (4.0.0), biblioteca a fost descompusă în trei zone funcționale: metode de lucru cu subspațiul Krylov ; precondiții și interfețe. Metodele de lucru cu subspațiul Krylov sunt de bază și nu sunt limitate în utilizare de bibliotecile standard care implementează obiecte de algebră liniară. Interfețele sunt destinate utilizării în algoritmi iterativi ai subspațiului Krylov ai operațiilor de bază ale algebrei liniare, implementate în biblioteci terțe, cum ar fi: MTL, Blitz++. Precondițiile sunt implementate numai pentru lucrul cu biblioteca MTL.
De asemenea, interfețele experimentale au fost incluse în această versiune pentru a sprijini calculul paralel .
Ideile stabilite în ITL au fost continuate și dezvoltate în proiectul Iterative Eigensolver Template Library (IETL) [2] .
Principiile programării generice , în cadrul cărora a fost creată biblioteca, [3] presupun simplificarea interfețelor. Acest lucru a făcut ca algoritmii ITL să semene cu un fel de pseudocod . Cel puțin în comparație cu alte implementări ale acelorași algoritmi. De exemplu, implementarea metodei gradientului conjugat ar arăta astfel:
/* operații necesare: mult,copy,dot_conj,add,scaled */ template < class Matrix , clasa VectorX , clasa VectorB , clasa Preconditioner , clasa Iteration > 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 ( dimensiune ( x )), q ( dimensiune ( x )), r ( dimensiune ( x )), z ( dimensiune ( x )); itl :: mult ( A , itl :: scaled ( x , -1.0 ), b , r ); în timp ce ( ! iter . terminat ( r )) { itl :: rezolva ( M , r , z ); rho = itl :: dot_conj ( r , z ); dacă ( iter.first ( ) ) itl :: copie ( z , p ); else { beta = rho / rho_1 ; itl :: add ( z , itl :: scaled ( p , beta ), p ); } itl :: mult ( A , p , q ); alpha = rho / itl :: dot_conj ( p , q ); itl :: add ( x , itl :: scaled ( p , alpha ), x ); itl :: add ( r , itl :: scaled ( q , - alpha ), r ); rho_1 = rho ; ++ iter ; } return iter . cod_eroare (); }