• Aucun résultat trouvé

Formalisation du domaine

Dans le document Courtage sémantique de services de calcul (Page 137-141)

5.2 L’algèbre linéaire

5.2.2 Formalisation du domaine

L’algèbre linéaire est un domaine qui se prête bien à une formalisation sous forme de spécification algébrique. En effet, elle comporte quatre types de base représentant les caractères, les scalaires, les vecteurs et les matrices, qui peuvent être déclinés selon les pro-priétés des éléments (réel, complexe, symétrique, inversible, ...). Les opérateurs sont ceux représentant les opérations qui peuvent être réalisées sur ces éléments : addition, multiplica-tion, transposimultiplica-tion, ... Les propriétés de ces éléments (associativité, distributivité, éléments neutres, ...) sont bien connues.

5.2.2.1 Les types

Pour les descriptions qui vont suivre, nous nous plaçons dans l’espace des réels R, mais toutes les descriptions peuvent être très facilement étendues au cas complexe.

Les types choisis pour représenter l’algèbre linéaire sont ceux décrivant : – les caractères – Char – les scalaires – Int, NzInt – Real, NzReal – les vecteurs – Vector

– VectorL (vecteurs lignes) – les matrices

– Matrix

– InvMatrix (matrices inversibles) – SymMatrix (matrices symétriques) – . . .

L’annexe B.1 (page 159) contient l’ensemble des types définis.

Ces différents types ont des liens de compatibilité représentés dans les figures 5.1 et 5.2.

Char Vector VectorL Int NzInt Real NzReal Double NzDouble Complex NzComplex

FIG. 5.1 – Liens d’héritage entre les différents types de l’algèbre linéaire

Matrix

InvMatrix

SymMatrix TriMatrix

SymInvMatrix DiagMatrix TriInvMatrix LowTriMatrix UnitTriMatrix UpTriMatrix

DiagInvMatrix

SymDefPosMatrix LowTriInvMatrix UnitTriInvMatrix UnitLowTriMatrix UpTriInvMatrix UnitUpTriMatrix

UnitLowTriInvMatrix UnitUpTriInvMatrix

FIG. 5.2 – Liens d’héritage entre les différents types de l’algèbre linéaire

5.2.2.2 Les opérateurs

Les opérateurs choisis sont ceux représentant l’addition, la soustraction, la multipli-cation, l’inverse, la transposé, les factorisations, . . . Ils peuvent être déclarés avec plusieurs signatures différentes. Ces signatures permettent également d’exprimer la conservation de certaines propriétés par un opérateur. Par exemple, la conservation de la symétrie d’une matrice par la transposition pourra être exprimée. « [comm] » signifie que l’opérateur est commutatif.

Les opérateurs représentant : – l’addition :

– + :Matrix× Matrix → Matrix [comm]

– + :SymMatrix× SymMatrix → SymMatrix [comm]

– . . .

– la soustraction :

– - : Matrix× Matrix→ Matrix

– . . .

– la multiplication :

– * :Matrix× Matrix → Matrix

– * :InvMatrix× InvMatrix → InvMatrix

– * :Real× Matrix → Matrix

– . . . – l’inverse :

– b-1 :InvMatrix → InvMatrix

– . . .

– bT :Matrix → Matrix

– bT :TriMatrix → TriMatrix

– . . .

– les factorisations :

– choleskyU :SymDefPosMatrix→ UpTriInvMatrix

– choleskyL :SymDefPosMatrix→ LowTriInvMatrix

– l :InvMatrix→ UnitLowTriInvMatrix

– u :InvMatrix→ UpTriInvMatrix

– pivlu :InvMatrix→ Vector

– les normes :

– norm1 :Vector→ Real

– norm2 :Vector→ Real

– . . .

Les constantes choisies sont celles représentant les éléments neutres et les éléments absorbants des opérateurs ci-dessus, ainsi que quelques caractères :

– 1 :→ NzInt – 0 :→ Int – 1.0 :→ NzReal – 0.0 :→ Real – I :→ DiagInvMatrix – O :→ Matrix – ’n’ :→ Char – . . .

L’ensemble des opérateurs et des constantes est consultable dans l’annexe B.2 (page 159).

5.2.2.3 Les équations

Les propriétés des opérateurs sont exprimées sous forme d’équations. Lorsque le type d’une variable n’est pas précisé, cela signifie que l’équation est valide quelque soit le type de cette variable, si les deux termes sont bien typés.

« => » signifie que cette règle peut être utilisée de manière orientée avec l’option de simplification d’une requête. « == » signifie que l’équation n’est jamais orientée.

Les propriétés définies dans le cas de l’algèbre linéaire sont les suivantes : – éléments neutres – =>(1.0 ∗ a) = a – =>(a + O) = a – . . . – éléments absorbants – =>(a ∗ O) = O – . . . – distribution / factorisation – ==((a ∗ b)b − 1) = ((bb − 1) ∗ (ab − 1)) – ==((abT )b − 1) = ((ab − 1)bT ) – . . . – associativité – ==(a ∗ (b ∗ c)) = ((a ∗ b) ∗ c) – ==(a + (b + c)) = ((a + b) + c) – . . .

L’ensemble des équations est présenté dans l’annexe B.3 (page 162). 5.2.3 Les bibliothèques

Parmi les bibliothèques d’algèbre linéaire, nous en avons choisi deux particulière-ment utilisées : BLAS et LAPACK. Ces deux bibliothèques ont été créées avec un souci de performance, nous y trouvons donc des services complexes comme évoqués précédemment.

5.2.3.1 BLAS

Le BLAS (Basic Linear Algebra Subprograms) [BDD+02, DDDH90] regroupe des procédures qui réalisent des opérations sur les matrices et vecteurs de façon performante. Le niveau 1 du BLAS s’intéresse aux opérations scalaire - vecteur et vecteur - vecteur. Le niveau 2 s’intéresse aux opérations matrice vecteur et le niveau 3 aux opérations matrice -matrice. Le BLAS, étant efficace et portable, est couramment utilisé dans d’autres librairies, comme c’est le cas pour LAPACK, qui propose des opérations de plus haut niveau.

Niveau 1 Parmi les procédures de niveau 1, se trouvent les additions de vecteurs, les mul-tiplications par un scalaire, le produit scalaire et les calculs de normes. Dans notre forma-lisme, les procédures du niveau 1 du BLAS s’expriment de la façon suivante :

– sscal(n : Int, α : Real, x : V ector, incx : Int) : x ← (α ∗ x)

– saxpy(n : Int, α : Real, x : V ector, incx : Int, y : V ector, incy : Int) : y ← ((α ∗ x) + y)

– . . .

Les procédures du niveau 1 du BLAS que nous avons décrites sont disponibles en annexe B.4.1 (page 164).

Niveau 2 Parmi les procédures de niveau 2, se trouvent les multiplications matrice - vec-teur, les résolutions de systèmes d’équations, . . . Dans notre formalisme, les procédures du niveau 2 du BLAS s’expriment de la façon suivante :

– sgemv(trans : Char, m : Int, n : Int, α : Real, a : M atrix, lda : Int, x : V ector, incx : Int, β : Real, y : V ector, incy : Int) :

y ← match

| (trans,n) → ((α ∗ (a ∗ x)) + (β ∗ y))

| (trans,t) → ((α ∗ ((abT ) ∗ x)) + (β ∗ y))

– ssymv(uplo : Char, n : Int, α : Real, a : M atrix, lda : Int, x : V ector, incx : Int, β : Real, y : V ector, incy : V ector) :

y ← ((α ∗ (a ∗ x)) + (β ∗ y))

– . . .

Les procédures du niveau 2 du BLAS que nous avons décrites sont disponibles en annexe B.4.2 (page 164).

Niveau 3 Parmi les procédures de niveau 3, se trouvent les additions et multiplications de matrices, le calcul de la transposée et la résolution de systèmes linéaires. Dans notre formalisme, les procédures du niveau 3 du BLAS s’expriment de la façon suivante :

– sgemm(transa : Char, transb : Char, m : Int, n : Int, k : Int, α : Real, A : M atrix, lda : Int, B : M atrix, ldb : Int, β : Real, C : M atrix, ldc : Int) :

M atrix

C ← ((α ∗ (op(transa, A) ∗ op(transb, B))) + (β ∗ C))

– strsm(side : Char, uplo : Char, transA : Char, diag : Char, m : Int, n : Int, α : Real, A : T riInvM atrix, lda : Int, B : M atrix, ldb : Int) : void [(A, U pT riInvM atrix, uplo,u), (A, LowT riInvM atrix, uplo,l), (A, U nitT riInvM atrix, diag,u), (A, M atrix, diag,n)]

B ← match

| (side,l) → (α ∗ (op(transA, (Ab − 1)) ∗ B))

| (side,r) → (α ∗ (B ∗ op(transA, (Ab − 1))))

– . . .

Les procédures du niveau 3 du BLAS que nous avons décrites sont disponibles en annexe B.4.3 (page 165).

5.2.3.2 LAPACK

LAPACK [ABB+99] (Linear Algebra PACKage) est une bibliothèque d’algèbre li-néaire écrite en Fortran77 qui contient des procédures pour résoudre les systèmes lili-néaires, le calcul des valeurs propres et des valeurs singulières. Les factorisations de matrices (LU, Cholesky, ...) sont aussi fournies. Les matrices denses et par bandes sont traitées, mais pas les matrices creuses. Dans tous les cas, les mêmes fonctionnalités sont fournies pour des matrices réelles ou complexes et en simple ou double précision.

LAPACK possédant un nombre très important de procédures (plus d’une centaine de procédures dans le cas des réels en simple précision), nous n’avons décrit qu’une petite partie de LAPACK dans notre formalisme :

– spotrf (uplo : Char, A : SymDef P osM atrix, inf o : Int) : V oid A ← match

| (uplo,u) → choleskyU (A)

| (uplo,l) → choleskyL(A)

– slaswp(n : Int, A : M atrix, lda : Int, k1 : Int, k2 : Int, ipiv : V ector, incx : Int) : V oid

A ← perm(ipiv, A)

– sgetrf (m : Int, n : Int, A : InvM atrix, lda : Int, ipiv : V ector, inf o : Int) : V oid

A ← l(A) A ← u(A) ipiv ← pivlu(A)

Nous remarquons dans ce dernier exemple que la matriceA est affectée à deux

va-leurs différentes. Nous avons accepté ce qui peut sembler être une erreur, pour répondre au fait qu’un même objet représente en fait deux objets différents. En effet la matrice A repré-sente dans sa partie supérieure, la matrice U (issue de la factorisation LU) et, dans sa partie inférieure, la matrice L.

Dans le document Courtage sémantique de services de calcul (Page 137-141)