Denition 2.13 Un domaine r est monotone (resp. anti-monotone ) ssi
3.1 La machine abstraite de Warren
4.3.3 Optimisations
Nous allons determiner les sources des appels inutiles a Tell et, dans certains cas, denir des optimisations pour les eviter. L'impact de celles-ci sera evalue en pourcentage deTells (totaux et inutiles) evites et en pourcentage de temps d'execution economise. La premiere mesure est interessante parce que independante de la machine donc generale. La seconde mesure permet toutefois de se faire une idee de l'impact d'une optimisation sur le temps de calcul.
Equivalence de contraintes
Le fait d'ecrire plusieurs contraintes X in r pour une m^eme contrainte de haut niveau a pour consequence que ces contraintes sont souvent equivalentes et donnent lieu a des appels inutiles.
Considerons la contrainte X = Y + 5, ('x=y+c'(X,Y,5), cf. exemple 2.1) dans le store courant :
fX in 5..15, Y in 0..10g donnant :
fX in 5..15, Y in 0..10,
X in min(Y)+5..max(Y)+5 (CX),
Y in min(X)-5..max(X)-5 (CY)g
Que se passe-t-il lors de l'ajout de la contrainte X in 12..100 ? X est initialise a 12::15 donc son min est propage a Y via CY (Y in 7..10). Or, du fait que le min de Y a ete modie, CX (X in 12..15) sera reexecute inutilement (i.e. le Tell ne modie pas le domaine de X). Evidemment, il est inutile d'evaluer a nouveau X a partir de Y puisque Y vient juste d'^etre evalue a partir de X et que CX etCY sont equivalents.
Optimisation 1 :
lors de l'ajout de la contrainte c, il est inutile de reexecuter c0 sic0 est equivalent a c.Dans la premiere version de clp(FD) (cf. [24]), cette optimisation etait implantee. Il n'y avait pas a proprement parler de detection des contraintes equivalentes mais plut^ot un imperatif pour l'utilisateur : toutes les contraintes denies dans une m^eme clause devaient
^etre equivalentes. Du fait que toutes ces contraintes se partageaient le m^eme environne- ment (pointe par AF) le test d'equivalence revenait a tester l'adresse des environnements necessaires aux contraintes impliquees. L'economie realisee etait de l'ordre de 18 % deTell representant 12 % du temps d'execution dans le meilleur des cas (equations lineaires) mais etait nulle dans le pire des cas (ex. queens).
Cette optimisation a ete abandonnee dans la version actuelle declp(FD)car d'une part son gain en temps d'execution est marginal et d'autre part elle est soumise a des conditions assez fortes (ex. inutilisable avec des divisions a cause des arrondis) et/ou diciles a contr^oler (ex. equivalence des contraintes ecrites par l'utilisateur). Enn, la le de propagation devait contenir des triplets de la forme <variable X, AF, listes a reactiver> pour permettre de reactiver les listes (indiquees) de contraintes dependant de X en testant l'adresse des environnements pour detecter l'equivalence. De ce fait, plusieurs triplets pour la m^eme variable (avec des pointeurs d'environnements dierents) pouvaient appara^tre dans la le.
La suppression de cette optimisation nous permet desormais d'utiliser une le dont les elements sont des couples de la forme <variable, listes a reactiver>. Il est aise d'assurer qu'il y a au plus un seul couple pour toute variableX (en regroupant les listes a reactiver en presence de plusieurs couples pour une m^eme variable). De ce fait, la taille de notre le de propagation est bornee par le nombre de variables. Il est alors possible de representer cette
Chain_Val Chain_Dom Chain_Min_Max Chain_Max Chain_Min Chains_Mask Chains_Stamp Vector Max Min Extra_Cstr Nb_Elem Range_Stamp Q_Next_Fdv_Adr Q_Propag_Mask Q_Date_At_Push FDV
variable DF Informations
sur le domaine
Informations file de propag.
Informations de dependances
Listes de contraintes dependant de la variable
Domaine
Masque listes non vides Estampille pour trail
Nombre d’elements du domaine Estampille pour trail
Ptr prochaine var. en file Masque listes a reexecuter Date derniere mise en file
Figure 12 : nouvelle representation interne d'une variable DF
le directement au travers des variables DF. La le ne necessite plus d'allocation explicite de memoire gr^ace a un cha^nage des variables. Lorsqu'une variable DF est modiee elle est juste cha^nee aux autres variables dont certaines contraintes doivent ^etre reactivees. Deux cas peuvent alors se produire :
la variable est deja cha^nee, il sut de mettre a jour la liste des contraintes a reveiller.
la variable n'est pas encore cha^nee, il sut de la cha^ner.
Notons que ce procede evite des mises en le multiples d'une m^eme variable donc de m^emes contraintes (cf. optimisation 3). Le moyen le plus ecace de tester si une variable est cha^nee consiste a dater toute mise en le. Un registre DATE est alors ajoute et est incremente a chaque appel de plus haut niveau d'une contrainte (i.e. par fd call constraint et non pas a chaque appel issu de la propagation). Ainsi, une variable X est cha^nee si
Date At Push(X) = DATE. La representation interne d'une variable est donc etendue pour prendre en compte les informations de cha^nage (cf. gure 12). Les registres BP etTP sont toujours utilises mais pointent desormais la premiere et la derniere variable DF de la le.
Impact :
la table 13 presente les gains de cette nouvelle organisation (cf. table 14 pour plus d'informations). La diminution moyenne de 5 % sur le nombre de Tells inutiles estdue aux re-executions evitees et sera expliquee lors de la presentation de l'optimisation 3.
Le benece moyen de 16 % sur le temps d'execution est en grande partie (environ 10 %) d^u aux simplications de certaines operations inherentes a la nouvelle le.
nb. de Tells Temps total inutile exec.
Pire (queens 70 ff) 0 % 0 % 12 %
Moyen 4 % 5 % 16 %
Meilleur (alpha ff) 13 % 16 % 25 % Tableau 13 : gain de la le optimisee
File optimisee Decomposition desTells
Temps Tell Reduc Verif Verif Echec Echec
Programme exec. (nombre) domaine domaine entier entier domaine
crypta 0.080 8302 2074 3754 2422 11 41
eq10 0.090 14341 2995 7792 3505 8 41
eq20 0.140 22059 5026 11164 5820 13 36
alpha 8.030 871838 254938 324838 283622 3817 4623
alpha ff 0.120 13176 2762 6392 4005 13 4
queens 16 1.390 64619 21132 6954 34700 834 999
queens 64 ff 0.170 4556 1813 276 2446 2 1
queens 70 ff 41.970 2009404 171859 81159 1747810 5387 3189
queens 81 ff 0.340 10633 3004 609 7011 6 3
five 0.010 558 225 52 267 14 0
cars 0.040 2439 402 1265 772 0 0
Tableau 14 : decomposition des Tells avec une le optimisee
Satisfaction de contraintes
Une autre source d'appels inutiles a Tell est due aux contraintes satisfaites qu'il est alors inutile de remettre en cause. Considerons par exemple la contrainteX 6=Y ('x6=y'(X,Y)) dans le store :
fX in 1..10, Y in 1..10g donnant :
fX in 1..10, Y in 1..10,
( X),
Y in -fval(X)g (CY)g
QuandX est initialise a 5, CY est reveille et 5 est supprime du domaine de Y fournissant le store suivant :
fX=5, Y in 1..4:6..10, CX,CYg
Supposons alors que la contrainte Y=8 soit ajoutee. Apres modication du domaine de
Y, la phase de propagation re-executera CX veriant inutilement que 5 6= 8. En eet, la contrainte CX est desormais satisfaite puisque 5 n'appartient plus au domaine de Y. Du fait qu'un resolveur sur les DF base sur la propagation locale n'est pas complet, il ne serait pas realiste de vouloir detecter \au plus juste" la satisfaction d'une contrainte. Ceci entra^nerait souvent l'enumeration des variables a chaqueTell. Ainsi, la meilleure maniere de faire consiste a utiliser une approximation de la condition de satisfaction. Au chapitre 6 nous detaillerons ce principe. Pour l'instant, considerons que la seule approximation (i.e.
condition susante) pour detecter la satisfaction d'une contrainte X in r est un test de cl^oture sur X, i.e. si X est clos dans S alors S satisfait X in r. Ainsi, dans l'exemple precedent, quand la contrainteY=8est ajoutee,X in -fval(Y)g est detectee comme etant satisfaite car X est clos. Evidemment, ceci n'est vrai que si X est devenu clos avant (et non pas pendant) la phase de propagation courante (i.e. toutes les propagations dues a la reduction de X doivent avoir ete eectuees).