Table of Contents
1 Détails numériques des expérimentations
On se propose ici de décrire comment les expérimentations numériques furent réalisées.
Le répertoire writings
comporte les '.org' des expérimentations. Le code python est 'tangle' depuis
ces fichiers vers le répertoire DD
. Une première section listera les différents fichiers, en précisant leurs dépendances.
Dans une seconde section, l'objectif/contenu des fichiers sera donné. Enfin une troisième section décrira numériquement les expérimentations.
On rappelle avant que l'objectif de ces expérimentations est l'étude numérique du gradient conjugué déflaté,
pour les résolutions successives de seconds membres multiples. Le système résoudre est de la forme:
Axs=bs avec s=1,2,…,ν et tel que bs+1 soit fonction de la solution xs calculée à l'étape s. On note n la dimension de A.
Le gradient conjugué déflaté noté CG-DEF
cherche la solution xs à l'étape s dans l'espace Kskm(A,Ws-1,r0s=vect(Ws-1,Vsm), où
m est le nombre d'itérations du CG-DEF
, et r0s=b-Ax0s le résidu à l'itération initiale de l'étape s. On note aussi Vms=[v0s|v1s|…|vm-1s]
la matrice de taille n× n dont les vecteurs colonnes forment une base pour le sous-espace de Krylov Kms(A,r0s). Et Ws=[w1|w2|…|wk] la matrice de déflation (de taille \(n\times k\)) de déflation dont les vecteurs
colonnes sont k approximations des vecteurs propres de A.
1.1 Listes des fichiers
Dans cette section, on donne la liste des fichiers '.py' situés dans le répertoire DD
.
On précise aussi leurs dépendances.
1.1.1 Fichier pour les solveurs
Le fichier DDMPY.py
contient les solveurs pour les problèmes de la forme Ax=b et Aw=λ w.
On donne ici la liste librairies python utilisées:
- _future__
import
printfunction
- collections
import
OrderedDict
- traceback
- time
- os
- utilisée pour lancer les script '.R' pour les sorties graphiques
- scipy
import
io
- scipy.sparse
=
import
[coo|csr|csc]matrix - scipy.linalg
- scipy.sparse.linalg
import
inv et eigsh
- matplotlib.pyplot
- csv
import
* utilise la fonctioncsv_cg()
pour sauvegarder les données ducg()
La fonction cg()
de DDMPY.py
utilise la fonction csv_cg()
. Cette fonction est tangle
depuis writings/MATRIX4EXP.org
vers DD/csv.py
.
1.1.2 Fichiers Pour les expériementations numériques
Ces fichiers sont tangles depuis le répertoire writings
vers le répertoires DD
.
Ils ont pour objectifs de réaliser les expérimentations numériques du rapport ../report/PFE_LEDERER.pdf. Les dépendances avec les librairies sont:
DDMPY.py
pour utiliser le gradient conjugué déflaté via la classeConjGrad()
et la fonctioncg()
et la fonctionsetmatrix4exp()
(tangle depuiswritings/MATRIX4EXP.org
versDD/csv.py
) pour
la construction des matrices cas tests et la fonction csv_eigen()
pour sauvegarder dans un fichier la qualité de l'information spectrale (tangle depuis writings/MATRIX4EXP.org
vers DD/csv.py
)
- os/sys pour executer les script '.R' en system command lines
La liste des fichiers d'expérimentations est la suivante:
EXP1_1.py
Pour étudier la convergence duCG-DEF
lorsque les vecteurs colonnes de la matrice de déflationW
sont les vecteurs propres exactes de \(A\)EXP1_1.R
etREXP1_1.R
pour la gestion des données sauvegarder et les sorties graphiques viaggplot2
EXP1_2.py
Pour étudier la convergence duCG-DEF
lorsque les vecteurs colonnes de la matrice de déflationW
sont les vecteurs propres perturbés de \(A\)EXP1_2.R
pour la gestion des données sauvegarder et les sorties graphiques viaggplot2
EXP2_1.py
Pour étudier la convergence la qualité de l'information spectral généré par la méthode de Lanczos Rayleigh-Ritz (RR) et Harmonic-Ritz (HR)- utilise la fonction
lanczos_RR()
tangle depuiswritings/MATRIX4EXP.org
versDD/csv.py
pour exécuter la procédure de Lanczos RR ou HR REXP2_1.R
pour la gestion des données sauvegarder et les sorties graphiques viaggplot2
- utilise la fonction
EXP3_1.py
pour étudier la convergence duCG-DEF
lorsque ν=2 et avec W(s=2) calculé via l'approche basée RR ou HREXP3_1.R
,REXP3_1.R
etREXP3_1_L.R
pour la gestion des données sauvegarder et les sorties graphiques viaggplot2
EXP3_2.py
pour étudier la convergence duCG-DEF
lors des résolutions successive à seconds membres multiples (ν ≥ 2) et avec W(s) calculé via l'approche basée RR ou HREXP3_2.R
,REXP3_2.R
etREXP3_2_L.R
pour la gestion des données sauvegarder et les sorties graphiques viaggplot2
1.1.3 Fichiers pour les sorties graphiques
Le fichier csv.py
comporte les fonctions csv_cg()
, csv_eigen()
, lanczos_RR()
et setmatrix4exp()
qui sont tangles depuis writings/MATRIX4EXP.org
vers DD/csv.py
.
On rappelle que csv.py
est une dépendance de DDMPY.py=et que les dépendances de =csv.py
sont numpy
, scipy.linalg
et os
.
csv_cg()
est utilisée dans la fonctioncg()
pour sauvegarder la convergence duCG-DEF
au cours des itérationscsv_eigen()
est utilisée dans les fichiers EXP pour sauvegarder la qualité de l'information spectralelanczos_RR()
pour la méthode de Lanczos RR et HRsetmatrix4exp()
pour construire les matrices cas test
Les fichiers '.R' permettent de gérer les données issues de csv_cg()
sauvegardées dans les fichiers et de générer les sorties graphiques (.pdf et .png)
dans les répertoires nommés en fonctions des paramètres de l'expérimentation (n,k, RR, HR, EXP[1_1|1_2|3_1|3_2]
) par exemple ../DD/HR_n_100_k_4_EXP3_2 pour les sorties du CG-DEF
.
Dans ces répertoires, l'utilisateur va trouver deux sous-répertoires EIGEN et ITE. Le répertoire EIGEN pour sauvegarder la qualité de l'information spectrale et le répertoire ITE pour
sauvegarder la convergence du CG-DEF
. Ces répertoires contiennent les sous-répertoires nommés en fonctions de la matrice utilisée A2 comme exemple. Les sorties graphiques sont réalisées
à ce niveau. Les fichers '.pdf' et '.png' sont nommés en fonctions des paramètres du cas test:
- BA pour backward error, DE pour direct error et IBA pour iterated backward error
- [A0|A1|A2|A3|A4] suivant la matrice cas test utilisée
L_l1_l2
avec [l1,l2] l'intervalle sur lequel leCG-DEF
sauvegarde les coefficients duCG-DEF
pour calculer W (exemple BAA2L051)- ZOOM une sortie graphique sur les premières itérations pour mieux observer l'effet de l'approximation de rang faible
- [LD|MD|LMD] des sorties graphiques via des facetgrid plus poussées suivant que la déflation soit à partir de LD, MD ou LMD (exemple LD1BA)
Les sorties liées à l'expérimentation EXP2_1.py
(étude de la procédure de Lanczos RR et HR) sont dans le répertoire LANCZOS.
1.2 Objectifs des fonctions
Cette sections présentent les fonctions utilisées pour le CG-DEF
et les expérimentations.
1.2.1 Dans DDMPY.py
On présente ici les deux fonctions permettant de gérer la déflation, ainsi que les nouvelles entrées/sorties que la déflation apporte
a la fonction cg()
et à la classe ConjGrad()
.
- Gestion des paramètres de déflation
Pour faire varier les paramètres ℓ et k de la déflation utilise plusieurs cas tests:
SI
- ['S0', 'S1', 'S2', 'S3'] liste de strings permettant de gérer les paramètres
l
etk
de la déflation- 'S0' pour utiliser le
CG
(pas de déflation) et 'S1', 'S2' ou 'S3' pour utiliser lzCG-DEF
- 'S1' pour paramétrer
l
etk
au nombre d'itérations réalisé lors de la résolution précédente - 'S2' pour paramétrer
l
like 'S1' aveck
dans [1, 2, 3, 4, 10, 50,…,n] (par exemple, (custom list)) - 'S3' pour fixer explicitement
l
etk
- 'S0' pour utiliser le
En pratique pour ℓ on utilise deux entiers
l1
etl2
tel que si leCG-DEF
converge enn_iter
itérations, on sauvegarde les coefficients duCG-DEF
calculés entre les itérations l1 et l2 dans les vecteurs/matrices globaux_cg_gamma
,_cg_ommega
,_cg_d
,_cg_p
,_cg_z
,_cg_mu
. La fonctionapply_strat(strat, W, n_iter)
(dansDDMPY.py) s'assure que =SI
soit bien valide en fonction den_iter
et reshape en conséquence les vecteurs /matrices. Les entrées/sorties de la fonction sont les suivantes:strat : list object [Wgiven, k, l1, l2, 'S0/S1/S2/S3/S4', 'LD/MD,LMD', s, 'RR/HR', sigma] - Wgiven : bolean, set to True if the user uses its own deflation subspace. - k : integer, number of eigenvector to compute. - [l1, l2] : integer, used to reduce information from the cg iterations. - str['S0|S1|S2|S3|S4'] : used to indicate how to reduce : 'S0': no deflation, 'S1': l1=0|l2=k=n_iter, 'S2': l1=0|l2=n_iter 'S3': user parameters default - str['LD|MD|LMD'] : used to indicate which part of the spectrum need to be computed. 'LD' Least Dominant, 'MD' Most Dominant, 'LMD' From both sides. - s : integer, current system to solve. - str['RR|HR'] : if 'RR' use Lanczos ritz procedure to compute eigenpair if 'HR' use Harmonic ritz. - sigma : real, Find eigenvalues near sigma. W : Matrix-like object, the deflation subspace. n_iter : integer, number of iteration computed by cg to solve the s-1 system. Explicit Returns : strat. Implicit Returns : _cg_omega, _cg_gamma, _cg_d, _cg_z, _cg_p, _cg_mu global variables.
- Construction et résolution du problème aux valeurs propres RR/HR
On réutilise les coefficients calculés lors de la résolution précédente pour calculer les approximations W des vecteurs propres de A. Pour ce faire on utilise la fonction
lanczos_hr(strat, n_iter, A, M, W)
avec les entrées/sorties suivantes:strat : list object [Wgiven, k, l1, l2, 'S0/S1/S2/S3/S4', 'LD/MD,LMD', s, 'RR/HR', sigma] - Wgiven : bolean, set to True if the user uses its own deflation subspace. - k : integer, number of eigenvector to compute. - [l1, l2] : integer, used to reduce information from the cg iterations. - str['S0|S1|S2|S3|S4'] : used to indicate how to reduce : 'S0': no deflation, 'S1': l1=0|l2=k=n_iter, 'S2': l1=0|l2=n_iter 'S3': user parameters default - str['LD|MD|LMD'] : used to indicate which part of the spectrum need to be computed. 'LD' Least Dominant, 'MD' Most Dominant, 'LMD' From both sides. - s : integer, current system to solve. - str['RR|HR'] : if 'RR' use Lanczos ritz procedure to compute eigenpair if 'HR' use Harmonic ritz. - sigma : real, Find eigenvalues near sigma. W : Matrix-like object, the deflation subspace. A : Matrix-like object from Ax=b M : Matrix-like object, a preconditionner n_iter : integer, number of iteration computed by cg to solve the s-1 system. Explicit Returns : W the updated deflation matrix
Pour calculer W on utilise l'approche basée RR ou HR suivant la valeur de strat[7]. La liste
strat
permet de gérer les paramètres de déflation et les cas test. - Nouvelles entrées/sorties de la fonction
cg()
et de la classeConjGrad()
Pour le
cg()
on a rajouté les entrées suivantes:- W : matrix-like object, the deflation matrix. Default is None. - strat : list object [Wgiven, k, l1, l2, 'S0/S1/S2/S3/S4', 'LD/MD,LMD', s, 'RR/HR', sigma] - Wgiven : bolean, set to True if the user uses its own deflation subspace. - k : integer, number of eigenvector to compute. - [l1, l2] : integer, used to reduce information from the cg iterations. - str['S0|S1|S2|S3|S4'] : used to indicate how to reduce : 'S0': no deflation, 'S1': l1=0|l2=k=n_iter, 'S2': l1=0|l2=n_iter 'S3': user parameters default - str['LD|MD|LMD'] : used to indicate which part of the spectrum need to be computed. 'LD' Least Dominant, 'MD' Most Dominant, 'LMD' From both sides. - s : integer, current system to solve. - str['RR|HR'] : if 'RR' use Lanczos ritz procedure to compute eigenpair if 'HR' use Harmonic ritz. - sigma : real, Find eigenvalues near sigma. -tags : list object ['A0/A1/A2/A3/A4', str(Irun), Stheta, rep, irr, str(enum_c), ISI, Ipart] - tags[0] in str['A0/A1/A2/A3/A4'] used to indicates wich matrix is used - tags[1] = str(Irun) where Irun is the run's number - tags[2] = Stheta a string in ['1E2/1E4/1E6'] used to indicates the eigenvalue orderr of the LD, MD or LMD - tags[3] = rep is the repository name for outputs - tags[4] = irr = "1" or "2" used to write header only one time - tags[5] = str(enum_c) where enum_c is an integer used to count cg() execution - tags[6] = ISI, where ISI is a string in str['S0|S1|S2|S3|S4'] - tags[7] = Ipart, where Ipart is a string in str['LD|MD|LMD']
La liste
tags
est utilisée pour les sorties graphiques, notamment pour nommer les labels, titres, répertoires, ect des sorties. La fonctioncg()
retourne initialement la solution calculéex
et le nombre d'itération réalisés notéi
dans le code. Lorsque l'on utilise la déflation, la fonctioncg()
retourne en plus la matriceW
. Concernant la classeConjGrad()
, elle prend aussi en entréeW
,strat
ettags
. En sortie, si strat[4]=='S0', elle retourne uniquement la solutionx
(pas de déflationCG
), sinon elle retourne en plusW
(déflationCG-DEF
).
1.3 Description des expériences numériques.
Pour étudier la convergence du CG-DEF
suivant les nombreux paramètres, on utilise l'instruction for
suivant ces paramètres:
n
et nk
sont utilisés respectivement pour fixer la dimension de la matrice A
et le nombre de valeurs propres clusterisées.
Les valeurs par défaut sont n=500 et nk =1. Elles sont paramètrables à l'exécution :
python3 EXP.py n nk
Les autres paramètres sont: Other parameters are:
mat
- ["A0", "A1", "A2", "A3", "A4"] Une liste de string pour paramétrer par nom l'opérateur linéaire de Ax=b
- le constructeur est
setmatrix4exp(which=Imat, n=n, k=nk, theta=Itheta)
- Imat l'itérand pour la liste
mat
- le constructeur est
theta
- [1e2, 1e4, 1e6] une liste de réel pour paramétrer
LD
(1/theta) ouMD
(theta) eigenvalue order.- Itheta l'itérand de
theta
- Itheta l'itérand de
maxrun
- un entier, fixé à 3 par défaut, donnant le nombre de run. Doit aussi être modifé dans le '.R'
- Irun l'itérand de
maxrun
- Irun l'itérand de
part
- ["LD", "MD", "LMD"] une liste de string indiquant quelle partie du spectre de A doit être déflatée
- "LD" déflation depuis la lowest dominant eigenvalue, "MD" depuis la most dominant eigenvalue et "LMD" depuis "LD" et "MD"
- Ipart l'itérand de
part
SI
- ['S0', 'S1', 'S2', 'S3'] liste de string pour gérer les paramètres de déflation (expliqué précédemment)
- ISI l'itérand sur
SI
- ISI l'itérand sur
Ikliste
- liste pour le nombre de vecteurs à déflater
- Ik et k les itérands sur Ikliste
- (no term)
i
l'itérand sur le nombre de seconds membres
Le schéma général pour les expériences est le suivant:
for Imat in mat: # Matrix loop for Itheta in theta: # Matrix parameter loop A,DA,QTA = setmatrix4exp(which=Imat, n=n, k=nk, theta=Itheta) # Matrix constructor for ISI in SI: # Deflation parameters loop for Ipart in part: # Deflation parameter loop for Ik in Ikliste: #Set k; l1; l2; RHR for Irun in maxrun: xexa = np.random.rand(A.shape[0],nrhs) b = A@xexa # ser Deflation parameters for i in nrhs: s = ConjGrad() # set solver x, W = s.dot(b[...,i:i+1]) # solve csv_eigen(A, W, DA, QTA, strat, tags=Tags) # Eigenvalues/vectors data # R script execution using system command lines