configuration du CAS dans giac

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

Modérateur : xcasadmin

Répondre
cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

configuration du CAS dans giac

Message par cdeval » mer. janv. 27, 2010 11:06 am

Bonjour Bernard,

un utilisateur me fait remarquer à juste titre qu'avec CmathOOoCAS, factoriser("x^2-2") ne fait pas apparaitre les racines, ce qui est normal puisque je ne passe aucune option à giac (ici 'sqrt' dévalidée).

J'avais l'intention de prévoir une fenêtre d'options comme la tienne ce qui permettrait de configurer les sorties de giac.

comment puis-je faire pour passer à giac ce type de préférences ?

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

Re: configuration du CAS dans giac

Message par parisse » mer. janv. 27, 2010 11:26 am

Ca peut se faire soit par des commandes utilisateur comme dans Xcas (cas_setup, with_sqrt, etc.) soit directement en appelant des fonctions de la libgiac, par exemple
giac::approx_mode(contextptr)=true;
giac::complex_mode(contextptr)=true;
etc.
elles sont declarees dans global.h

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: configuration du CAS dans giac

Message par cdeval » mer. janv. 27, 2010 2:08 pm

ok,
je me suis dirigé vers les commandes xcas parce que je sais appeler une commande giac via le basic de OOo et ainsi je peux facilement reprendre les paramètres choisis par l'utilisateur via une boite de dialogue et appeler cas_setup(....) ou with_sqrt (au passage : cette instruction semble absente de la liste des commandes).
Malheureusement, deux problèmes :
1) with_sqrt(1) me renvoie dans la cellule "Running in secure mode Error : bad argument value"
2) cas_setup est bien accepté mais ce que je craignais se produit, les options ne sont pas persistantes. Si je me mets en mode approx et qu'à la cellule du dessous je tape "1/2" je n'obtiens pas 0.5 mais 1/2

je crois que je vais devoir me tourner vers les fonctions giac mais la difficulté pour moi va être d'aller chercher (avec du code C++) avant chaque appel de fonctions dans une cellule les variables définies dans OOo. Serge aura peut-être une idée là-dessus.

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: configuration du CAS dans giac

Message par cdeval » sam. janv. 30, 2010 8:21 am

cdeval a écrit :ok,
2) cas_setup est bien accepté mais ce que je craignais se produit, les options ne sont pas persistantes. Si je me mets en mode approx et qu'à la cellule du dessous je tape "1/2" je n'obtiens pas 0.5 mais 1/2
Bon, avant de partir dans des recherches compliquées, est-il possible que giac garde en mémoire les options sélectionnées d'une session à l'autre ?
Par exemple dans une console, je tape :

Code : Tout sélectionner

giac
approx_mode:=1
Ctrl D
ensuite :

Code : Tout sélectionner

giac
1/2
et j'ai perdu le mode approché, j'aimerai le conserver.
Cela résoudrait simplement mon problème dans OOoCalc où chaque instruction doit être une session giac à elle seule ce qui fait que je ne peux pas lui affecter les préférences d'une session antérieure.

Si ce n'est pas possible, il va falloir que je cherche un moyen de récupérer une variable OOoBasic à partir de C++ et que je lance cas_setup dans mon code, ce qui risque de ne pas être simple....

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

Re: configuration du CAS dans giac

Message par parisse » sam. janv. 30, 2010 12:32 pm

C'est un peu bizarre de devoir relancer giac de zéro à chaque appel depuis OO, du coup ça n'est pas très efficient.
On peut essayer de créer une variable statique dans le code d'interfaçage C++ de OO avec giac

Code : Tout sélectionner

  static giac::gen g=symbolic(giac::at_cas_setup,giac::cas_setup(contextptr));
  giac::protecteval(g,1,contextptr);
  // suite du code d'interfaçage
  g=symbolic(giac::at_cas_setup,giac::cas_setup(contextptr));
Si ça ne marche pas, le mieux c'est peut-etre de faire comme pour xcas en ligne, utiliser un fichier de sauvegarde du contexte, la fonction giac qui fait ça est
archive_session(bool save_history,const string & s,context *);
où s est le nom du fichier archive à créer par exemple "giac_oo", save_history permet de sauvegarder l'historique des commandes (inutile ici, utiliser false) et utiliser 0 comme pointeur de contexte.
Pour récupérer l'archive le coup suivant, il faut utiliser
unarchive_session(const string & s,int level, const gen & replace,context *)
en mettant par exemple pour level 0, et en déclarant avant un giac::gen de nom replace.

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: configuration du CAS dans giac

Message par cdeval » sam. janv. 30, 2010 9:20 pm

Bon, j'ai avancé.
il me semblait aussi étrange qu'une session giac soit ouverte puis fermée pour chaque cellule de OOoCalc.
En fait, c'est le fait que mon instruction "cas_setup(....)" ne soit pas prise en compte dans les cellules définies ensuite qui m'a fait penser que le contexte giac était renouvelé à chaque cellule mais il semble que non.
J'ai repris l'instruction giac::child_id=1; qui résout le plantage de l'instruction "laplace()" et je l'ai déplacée dans le code d'une autre fonction ( j'ai pris la valeur absolue).
Si j'appelle laplace(x) dans une cellule -> plantage de OOo
si j'appelle abs(x) dans une cellule (donc au passage il exécute child_id=1) puis laplace(x) dans une autre -> plus de plantage. La variable est donc restée en mémoire.
Cela est plutôt bon signe pour le contexte et a priori je devrais pouvoir définir mes options CAS une fois pour toute.
J'ai donc essayé de placer giac::approx_mode(contextptr)=true; dans une de mes fonctions : ça ne marchait pas !

J'ai essayé en dehors de OOo, ça ne marche pas non plus :

Code : Tout sélectionner

// -*- compile-command: "g++ -g test.cc -lgiac -lgmp" -*-
#include <giac/giac.h>
using namespace std;
using namespace giac;

int main(){
	giac::context * contextptr=0;
	giac::approx_mode(contextptr)=true;
	for(;;){
	gen a;
	cout << "Tapez une expression : ";
	cin >> a;
	cout << "resultat : " << eval(a,contextptr) << endl;
	}
}
voilà ce que ça donne :

Code : Tout sélectionner

chris@Cosmos:~/Documents/openoffice/CmathOOo2.3/CmathOOoCas/Giac$ ./a.out 
Tapez une expression : 1/2
resultat : 1/2
Je m'y prends mal ?

j'ai essayé aussi ça :

Code : Tout sélectionner

chris@Cosmos:~/Documents/openoffice/CmathOOo2.3/CmathOOoCas/Giac$ ./a.out 
Tapez une expression : with_sqrt(1)
terminate called after throwing an instance of 'std::runtime_error'
  what():  Running in secure mode Error: Bad Argument Value
Abandon
chris@Cosmos:~/Documents/openoffice/CmathOOo2.3/CmathOOoCas/Giac$ ./a.out 
Tapez une expression : approx_mode:=1
Signal #2 défini par l'usager
chris@Cosmos:~/Documents/openoffice/CmathOOo2.3/CmathOOoCas/Giac$ 
j'ai essayé aussi d'affecter des variables mais ça me donne un signal #2 à chaque fois. Je ne dois pas utiliser la bonne syntaxe...
Voilà, ou j'en suis !

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

Re: configuration du CAS dans giac

Message par parisse » dim. janv. 31, 2010 8:12 am

Pour approx_mode, c'est juste parce que xcas appelle evalf au lieu de eval lorsqu'on est en mode approché, il vaudrait mieux faire le test avec withsqrt et factoriser x^2-2

Code : Tout sélectionner

// -*- compile-command: "g++ -g test.cc -lgiac -lgmp" -*-
#include <giac/giac.h>
using namespace std;
using namespace giac;

int main(){
   giac::context * contextptr=0;
   giac::withsqrt(contextptr)=false; // true;
   gen a;
   cout << "Tapez une expression : ";
   cin >> a;
   cout << "resultat : " << _factor(a,contextptr) << endl;
}
Pour la suite, c'est comme depuis OO, il faut que giac::child_id=1; et eventuellement giac::secure_run=false; pour éviter le déclenchement du signal SIGUSR2 et premettre l'accès à toutes les fonctionnalités de giac (secure_run=true; sert à éviter des trous de sécurité pour xcas en ligne)

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: configuration du CAS dans giac

Message par cdeval » dim. janv. 31, 2010 3:38 pm

Super, tous mes problèmes sont résolus !

en fait, je m'étais focalisé pour mes tests dans OOo sur le passage en mode approx via cas_setup(1,.....)
Comme tu l'as dit, il n'y que xcas qui en tienne compte en passant des evalf, giac reste en mode exact, d'où ma conclusion que ça ne marchait pas !

En ajoutant giac::child_id=1; je peux utiliser cas_setup() comme instruction giac et le contexte est conservé pour toutes les cellules de OOo. Donc tout va pour le mieux : je vais pouvoir facilement mettre en place une boite de dialogue "préférence pour le CAS" dans OOo et appeler cas_setup via le basic de OOo (je transmets déjà des instructions giac via le traitement de texte pour effectuer des calculs).

un petit exemple pour le plaisir :
j'ai choisi le mode degré, le mode complexe et 20 chiffres après la virgule.
screenshot_082.png
screenshot_082.png (49.54 Kio) Consulté 9164 fois
Seul petit truc que je devrais régler : le contexte étant perdu à la fermeture de OOo, si on modifie les préférences et qu'on rouvre le fichier plus tard elles sont perdues. Je pourrais écrire l'instruction cas_setup() dans une cellule, ce qui provoquerait son évaluation automatiquement à l'ouverture du document mais à mon avis, il faudrait qu'elle soit évaluée avant les autres sinon ça ne sert à rien.
Une autre solution serait que je créé une macro de type auto-run liée au document avec l'appel de cas_setup à l'intérieur.
Je vais réfléchir à ça.
En tout cas, merci encore.

PS : il semble que cas_setup accepte plus d'arguments que ceux décrits dans l'aide de xcas. J'en ai trouvé un peu plus sur la doc en ligne, mais je suis aussi tombé là : http://people.math.jussieu.fr/~han/agre ... 07-sol.pdf sur un étrange :
cas_setup(0,0,0,1,0,1e-10,10,[1,50,0,25],0,0,0);
ça m'intéresse d'en savoir plus....

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

Re: configuration du CAS dans giac

Message par parisse » dim. janv. 31, 2010 6:50 pm

Et pourquoi ne pas sauvegarder tout ça dans un fichier comme xcas.rc pour xcas?
Sinon, pour les arguments de cas_setup, le mieux c'est de regarder dans prog.cc à partir de la ligne 3850 environ.

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: configuration du CAS dans giac

Message par cdeval » jeu. févr. 04, 2010 1:34 pm

ok, merci pour ces précisions.
je vais regarder tout ça.
A+

Répondre