Différence de comportement de gbasis

Librairie C++ de calcul formel/ C++ symbolic computation library

Modérateur : xcasadmin

Répondre
Dominique MICOLLET
Messages : 52
Inscription : jeu. janv. 11, 2007 10:39 am
Localisation : Université de Bourgogne - France

Différence de comportement de gbasis

Message par Dominique MICOLLET » jeu. mars 18, 2010 9:58 am

Bonjour,



Dans une application de calculs d'invariants en mécanique, j'utilise la libgiac pour le calcul formel,
et plus particulièrement la fonction _gbasis.

Or le résultat fourni n'est pas celui attendu.

Plus exactement, le résultat fourni de manière interactive par xcas diffère de celui fourni
par un appel direct à la fonction dans un programme c++.

Extrait de la session xcas (copié-collé depuis l'interface):
-----
Commande :
gbasis([X_6^2-Y_1,(X_1*X_6+X_4*X_6)/2-Y_2,(X_3^2+X_5^2)/2-Y_3,(3*X_1^2+2*X_1*X_4+4*X_2^2+3*X_4^2)/8-Y_4,(X_1^2+6*X_1*X_4-4*X_2^2+X_4^2)/8-Y_5,(X_1^2-2*X_1*X_4+4*X_2^2+X_4^2)/8-Y_6,X_6-Y_7,(X_1+X_4)/2-Y_8 ],
[X_1,X_2,X_3,X_4,X_5,X_6,Y_1,Y_2,Y_3,Y_4,Y_5,Y_6,Y_7,Y_8]);
Réponse :
[X_1+X_4-2*Y_8,-X_2^2-X_4^2+2*X_4*Y_8+2*Y_6-Y_8^2,X_3^2+X_5^2-2*Y_3,X_6-Y_7,-Y_1+Y_7^2,-Y_2+Y_7*Y_8,Y_4-Y_6-Y_8^2,-Y_5-Y_6+Y_8^2]
--------

Cette réponse est conforme, et identique (au signe près) à la réponse fournie par maple ou maxima.

Or l'appel direct de _gbasis dans le programme c++ donné en fichier joint compilé avec

------
g++ -O0 -g -Wall -lgiac -lgmp -o essai_gbasis essai_gbasis.cpp
------

donne le resultat suivant :
------
[X_6-Y_7,-Y_1+Y_7^2,-Y_2+(X_1*X_6+X_4*X_6)/2,-Y_3+[X_6-Y_7,-Y_1+Y_7^2,-Y_2+(X_1*X_6+X_4*X_6)/2,-Y_3+(X_3^2+X_5^2)/2,-Y_4+(3*X_1^2+2*X_1*X_4+4*X_2^2+3*X_4^2)/8,-Y_5+(X_1^2+6*X_1*X_4-4*X_2^2+X_4^2)/8,-Y_6+(X_1^2-2*X_1*X_4+4*X_2^2+X_4^2)/8,-Y_8+(X_1+X_4)/2](X_3^2+X_5^2)/2,-Y_4+(3*X_1^2+2*X_1*X_4+4*X_2^2+3*X_4^2)/8,-Y_5+(X_1^2+6*X_1*X_4-4*X_2^2+X_4^2)/8,-Y_6+(X_1^2-2*X_1*X_4+4*X_2^2+X_4^2)/8,-Y_8+(X_1+X_4)/2]
-----
qui diffère notablement de celui produit interactivement ( entre autres, il manque plusieurs relations ne comportant que les Y_x).

Noter que giac a été compilée sans CoCoa.

À l'évidence, j'emploie mal _gbasis et je ne maîtrise pas assez la libgiac pour m'en sortir seul.
Un conseil serait donc le bienvenu.

Navré pour la complexité de l'exemple, mais c'est le seul dont je dispose actuellement pour montrer l'effet.


Cordialement

Dominique MICOLLET

Post-Scriptum : j'ai une grande difficulté à utiliser l'outil de recherche sur le forum :
je ne parviens même pas à retrouver d'anciens messages que j'y ai posté en utilisant le mot clef
gbasis ou mon nom alors que google me les retrouve. Suis-je incompétent ou l'outil de recherche a-t-il une défaillance ?
Cordialement

Dominique MICOLLET

Dominique MICOLLET
Messages : 52
Inscription : jeu. janv. 11, 2007 10:39 am
Localisation : Université de Bourgogne - France

Re: Différence de comportement de gbasis

Message par Dominique MICOLLET » jeu. mars 18, 2010 9:59 am

Visiblement l'attachement de fichier n'a pas fonctionné : je recopie le code d'essai_gbasis.cpp :
------
#include <string>
#include <giac/giac.h>
#include <giac/misc.h>
using namespace std;
using namespace giac;


int main(int argc, char * argv[])
{
string liste_polynomes="[X_6^2-Y_1,(X_1*X_6+X_4*X_6)/2-Y_2,(X_3^2+X_5^2)/2-Y_3,(3*X_1^2+2*X_1*X_4+4*X_2^2+3*X_4^2)/8-Y_4,(X_1^2+6*X_1*X_4-4*X_2^2+X_4^2)/8-Y_5,(X_1^2-2*X_1*X_4+4*X_2^2+X_4^2)/8-Y_6,X_6-Y_7,(X_1+X_4)/2-Y_8 ]";

string ordre_lexicographique="[X_1,X_2,X_3,X_4,X_5,X_6,Y_1,Y_2,Y_3,Y_4,Y_5,Y_6,Y_7,Y_8]";

string Resultat;
cerr << "Version Giac : " << _version(NULL).print() << endl<< endl;
cerr << "Liste des polynomes anonymes"<< endl<< liste_polynomes << endl<< endl;
cerr << "Ordre Lexicographique "<< endl << ordre_lexicographique << endl<< endl;
Resultat =_gbasis(gen(liste_polynomes + "," +ordre_lexicographique,NULL),NULL).print();
cerr << "Resultat"<< endl << Resultat << endl<< endl;
return 0;
}
-----

Dominique
Cordialement

Dominique MICOLLET

parisse
Messages : 5745
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Différence de comportement de gbasis

Message par parisse » jeu. mars 18, 2010 12:05 pm

C'est tres certainement le support de la libcocoa qui est en cause, je n'ai jamais vraiment teste le code appele si cocoa n'est pas present, en tout cas, ce n'est absolument pas competitif comme code. Pour utiliser cocoa, il faut soit compiler giac-0.9.0 et une version a jour de CoCoA, soit compiler giac-0.8.5 et une ancienne version de CoCoA.
Sinon, pour la recherche dans le forum, je ne sais pas, mais ce n'est pas trop grave si on peut utiliser google.

Dominique MICOLLET
Messages : 52
Inscription : jeu. janv. 11, 2007 10:39 am
Localisation : Université de Bourgogne - France

Re: Différence de comportement de gbasis

Message par Dominique MICOLLET » jeu. mars 18, 2010 1:55 pm

Rebonjour,

Je ne comprends pas bien votre réponse.

J'ai compilé giac sans support de CoCoa, qui n'est d'ailleurs pas installé sur ma machine, et pour ce que j'ai compris du prototype de _gbasis, cette fonction n'y fait pas appel.
Il ne devrait donc y avoir aucune référence à la libcocoa. ldd ne la mentionne d'ailleurs pas.

Il me semble donc que xcas et mon problème font appel au même code sous-jacent, et que c'est plutôt ma manière d'appeler ce code qui défaille puisque l'interface interface interactive donne le bon résultat.

Je vais essayer de compiler libgiac avec cocoa.
Cependant j'ai un petit souci avec votre suggestion : la page de telechargement des sources offre soit la version frozen qui semble etre la version 0.8.4 soit la version unstable que je suppose etre la version 0.9.0.
Je préferais utiliser la version stable : pourriez me conseiller quant au numéro de "vieille version" de cocoa à mettre en oeuvre.

Incidemment, icas fourni aussi la bonne réponse.

Cordialement

Dominique
Cordialement

Dominique MICOLLET

parisse
Messages : 5745
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Différence de comportement de gbasis

Message par parisse » jeu. mars 18, 2010 2:08 pm

Si, si _gbasis appelle bien la libcocoa mais seulement si la libgiac est compilee avec support pour CoCoA (il y a des #ifdef dans cocoa.cc, et l'appel a cocoa_gbasis renvoie false si pas de support CoCoA). Pour la version de CoCoA compatible avec giac <0.9 c'est la 0.9915 dont je garde une copie sur le serveur ftp ftp-fourier.ujf-grenoble.fr, repertoire xcas/devel/sources (je n'arrive pas a mettre le lien ftp direct dans le post...)

Dominique MICOLLET
Messages : 52
Inscription : jeu. janv. 11, 2007 10:39 am
Localisation : Université de Bourgogne - France

Re: Différence de comportement de gbasis

Message par Dominique MICOLLET » jeu. mars 18, 2010 3:07 pm

ReRebonjour,

J'ai tracé avec ddd le fonctionnement de mon programme et celui d'icas pour le meme probleme.

Les deux suivent vers la fin le même cheminement dans le code :
appel de _gbasis qui appelle gbasis qui essaye sans succes cocoa_gbasis et qui continue donc avec la methode standard.

La différence de comportement doit donc relever d'une différence de l'expression de type gen que je transmet directement à _gbasis.

Le problème est que je n'arrive pas à afficher cette chaîne avec le degugger ddd. Si vous savez le faire pourriez-vous m'indiquer comment vous faites ?

Cordialement.

Dominique
Cordialement

Dominique MICOLLET

parisse
Messages : 5745
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Différence de comportement de gbasis

Message par parisse » jeu. mars 18, 2010 3:25 pm

j'utilise gdb directement (en general dans emacs), avec une macro pour appeler la methode dbgprint(), je ne sais pas si c'est faisable avec ddd. La definition de la macro est placee dans le fichier .gdbinit
more .gdbinit
echo Defining v as print command for giac types\n
define v
print ($arg0).dbgprint()
end
Par contre c'est curieux que icas ne passe pas par cocoa, sauf si c'est celui que vous avez compile (et non un de ceux que je fournis pre-compiles).

Dominique MICOLLET
Messages : 52
Inscription : jeu. janv. 11, 2007 10:39 am
Localisation : Université de Bourgogne - France

Re: Différence de comportement de gbasis

Message par Dominique MICOLLET » jeu. mars 18, 2010 3:57 pm

ddd est une interface graphique de gdb. Votre definition de v marche parfaitement.

J'ai donc trace l'argument de _gbasis dans les deux cas (mon programme et icas).

Ils ont rigoureusement identiques.......

Il y a donc un problème plus bas. Je ne parviens malheureusement pas à afficher les polyvect et quelques autres variables.

Pour ce qui concerne icas ne passant pas par libcocoa, je me rends compte que j'ai oublié de préciser que j'ai tout compilé depuis la source giac_frozen : il est donc normal que icas n'emploie pas la libcocoa.

Je vais essayer de reprendre tout cela demain.

Merci de votre aide et bonne fin de journée.

Cordialement.
Cordialement

Dominique MICOLLET

Dominique MICOLLET
Messages : 52
Inscription : jeu. janv. 11, 2007 10:39 am
Localisation : Université de Bourgogne - France

Re: Différence de comportement de gbasis

Message par Dominique MICOLLET » jeu. mars 18, 2010 3:58 pm

>>Ils ont rigoureusement identiques.......
Ils sont rig.....
Cordialement

Dominique MICOLLET

parisse
Messages : 5745
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Différence de comportement de gbasis

Message par parisse » jeu. mars 18, 2010 7:36 pm

Alors, c'est peut-etre du à l'évaluation. Avant d'appeler _gbasis sur g, où g désigne un gen créé à partir de la chaine, il faudrait essayer de faire g=eval(g,1,context0); et voir si ça donne le même résultat.
Sinon, vectpoly devrait etre imprimable, mais il manque peut-etre l'instanciation de la méthode dbgprint().

Dominique MICOLLET
Messages : 52
Inscription : jeu. janv. 11, 2007 10:39 am
Localisation : Université de Bourgogne - France

Re: Différence de comportement de gbasis

Message par Dominique MICOLLET » ven. mars 19, 2010 9:44 am

Bonjour,

>>Avant d'appeler _gbasis sur g, où g désigne un gen créé à partir de la chaine, il faudrait essayer de faire g=eval(g,1,context0); et voir si ça donne le même résultat.

Ça marche !!!! :D :D :D

Maintenant, la question qui tue.... :twisted: Pourquoi ?

Cela semble lié au contexte.

Tous mes appels directs à libgiac usent d'un pointeur NULL pour le contexte.
Est ce une bonne ou une mauvaise chose, et dans ce dernier cas, que conviendrait-il de faire ?

Quoi qu'il en soit, merci de votre aide.

PS : je n'arrive pas à quoter correctement avec le bouton ad-hoc de l'interface du forum : c'est quoi l'astuce ?
Cordialement

Dominique MICOLLET

parisse
Messages : 5745
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Différence de comportement de gbasis

Message par parisse » ven. mars 19, 2010 11:36 am

Dominique MICOLLET a écrit :Bonjour,

>>Avant d'appeler _gbasis sur g, où g désigne un gen créé à partir de la chaine, il faudrait essayer de faire g=eval(g,1,context0); et voir si ça donne le même résultat.

Ça marche !!!! :D :D :D

Maintenant, la question qui tue.... :twisted: Pourquoi ?
C'est parce que eval permet de reecrire les operations rationnelles (+ - * / ^) sous une forme standard attendue par les autres fonctions de giac.
Cela semble lié au contexte.

Tous mes appels directs à libgiac usent d'un pointeur NULL pour le contexte.
Est ce une bonne ou une mauvaise chose, et dans ce dernier cas, que conviendrait-il de faire ?
NULL designe le contexte global. Au depart, il n'y avait pas de possibilite d'executer giac dans des threads distincts sans risque de collision, les contextes permettent de le faire (par ex. avoir une variable a assignee dans un thread et non assignee dans un autre). Le contexte global devrait marcher correctement, mais c'est mieux d'utiliser un contexte non global, pour ca il faut definir une variable de contexte par exemple
giac::context ct;
puis utiliser &ct au lieu de NULL en dernier parametre des fonctions qui utilisent un pointeur de contexte.
Quoi qu'il en soit, merci de votre aide.
PS : je n'arrive pas à quoter correctement avec le bouton ad-hoc de l'interface du forum : c'est quoi l'astuce ?
normalement il faut mettre crochet ouvrant quote crochet fermant et finir par crochet ouvrant slash quote crochet fermant

Répondre