Différence de comportement de gbasis
Modérateur : xcasadmin
-
- Messages : 52
- Inscription : jeu. janv. 11, 2007 10:39 am
- Localisation : Université de Bourgogne - France
Différence de comportement de gbasis
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 ?
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
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
------
#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
Dominique MICOLLET
Re: Différence de comportement de gbasis
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.
Sinon, pour la recherche dans le forum, je ne sais pas, mais ce n'est pas trop grave si on peut utiliser google.
-
- Messages : 52
- Inscription : jeu. janv. 11, 2007 10:39 am
- Localisation : Université de Bourgogne - France
Re: Différence de comportement de gbasis
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
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
Dominique MICOLLET
Re: Différence de comportement de gbasis
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...)
-
- Messages : 52
- Inscription : jeu. janv. 11, 2007 10:39 am
- Localisation : Université de Bourgogne - France
Re: Différence de comportement de gbasis
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
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
Dominique MICOLLET
Re: Différence de comportement de gbasis
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).
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).
-
- Messages : 52
- Inscription : jeu. janv. 11, 2007 10:39 am
- Localisation : Université de Bourgogne - France
Re: Différence de comportement de gbasis
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.
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
>>Ils ont rigoureusement identiques.......
Ils sont rig.....
Ils sont rig.....
Cordialement
Dominique MICOLLET
Dominique MICOLLET
Re: Différence de comportement de gbasis
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().
Sinon, vectpoly devrait etre imprimable, mais il manque peut-etre l'instanciation de la méthode dbgprint().
-
- Messages : 52
- Inscription : jeu. janv. 11, 2007 10:39 am
- Localisation : Université de Bourgogne - France
Re: Différence de comportement de gbasis
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 !!!!
Maintenant, la question qui tue.... 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 ?
>>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 !!!!
Maintenant, la question qui tue.... 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
Dominique MICOLLET
Re: Différence de comportement de gbasis
C'est parce que eval permet de reecrire les operations rationnelles (+ - * / ^) sous une forme standard attendue par les autres fonctions de giac.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 !!!!
Maintenant, la question qui tue.... Pourquoi ?
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 exempleCela 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 ?
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.
normalement il faut mettre crochet ouvrant quote crochet fermant et finir par crochet ouvrant slash quote crochet fermantPS : je n'arrive pas à quoter correctement avec le bouton ad-hoc de l'interface du forum : c'est quoi l'astuce ?