mingw et pari

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

Modérateur : xcasadmin

Répondre
frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

mingw et pari

Message par frederic han » mer. août 02, 2017 3:52 pm

Salut,
j'essaye de compiler giac avec

Code : Tout sélectionner

./configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32
sans pari ca marche (modulo quelques problemes avec tms et times virés dans icas.cc:

Code : Tout sélectionner

--- /home/fred/tmp/giac-1.2.3/src/icas.cc	2017-06-27 20:22:06.000000000 +0200
+++ giac-1.2.3/src/icas.cc	2017-08-02 13:08:22.837183739 +0200
@@ -1501,7 +1501,7 @@
   }
 #ifdef HAVE_LIBREADLINE
   if (ARGC==1){
-    struct tms start, end;  
+    //fred struct tms start, end;  
     using_history();
     cout << "Welcome to giac readline interface" << endl;
     cout << "(c) 2001,2016 B. Parisse & others" << endl;
@@ -1561,12 +1561,12 @@
 #ifdef __APPLE__
       unsigned startc=clock();
 #endif
-      times(&start);
+      //times(&start);
       xcas::icas_eval(gq,ge,reading_file,filename,contextptr);
 #ifdef __APPLE_
       startc=clock()-startc;
 #endif
-      times(&end);
+      //times(&end);
       giac::history_in(contextptr).push_back(gq);
       giac::history_out(contextptr).push_back(ge);
       // 2-d plot?
@@ -1592,7 +1592,7 @@
 #ifdef __APPLE__
 	cerr << "// dclock1 " << double(startc)/CLOCKS_PER_SEC << endl;
 #endif
-	cerr << "// Time " << giac::delta_tms(start,end) << endl;
+	//cerr << "// Time " << giac::delta_tms(start,end) << endl;
       }
 #ifdef HAVE_EQASCII
       struct Tgraph *graph=(Tgraph *)malloc(sizeof(struct Tgraph));
@@ -1665,8 +1665,8 @@
   gettimeofday(&tt,0);
   giac::gen et((int) tt.tv_sec);
   string st(et.print(contextptr));
-  struct tms start, end,f1,f2;  
-  times(&start);
+  //struct tms start, end,f1,f2;  
+  //times(&start);
   f2=start;
 #endif
   //xcas_mode(contextptr)=1;
en revanche avec pari j'ai une confusion:

Code : Tout sélectionner

pari.cc: In function 'long int* giac::mat2GEN(const giac::gen&, const vecteur&, const giac::context*)':
pari.cc:490:28: error: cannot convert 'GEN {aka long long int*}' to 'giac::GEN {aka long int*}' in initialization
     GEN res=cgetg(n+1,t_MAT);

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

Re: mingw et pari

Message par parisse » mer. août 02, 2017 4:49 pm

bizarre, essaie de remplacer GEN par long long int *?

frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: mingw et pari

Message par frederic han » sam. août 05, 2017 8:10 am

En fait la confusion vient du fait que dans pari: parigen.h contient un

Code : Tout sélectionner

#ifdef _WIN64
...
#define long long long
ce qui crée des confusions dans giac selon que l'on est avant (comme dans giac/pari.h) ou apres comme dans giac/pari.cc

J'ai l'impression d'avoir reussi à avoir un icas avec pari avec les corrections brutales suivantes:

(Je n'ai pas essayé de mettre un #define long long long dans pari.h)
1) dans pari.h j'ai remplacé les long par long long lignes 11 et 32
2) dans pari.cc j'ai mis des () autour de long lignes 201 et 205

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

Re: mingw et pari

Message par parisse » sam. août 05, 2017 11:20 am

Et si tu deplaces

Code : Tout sélectionner

typedef long * GEN;
avant le namespace, ca change quelque chose? (ce serait plus logique)

frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: mingw et pari

Message par frederic han » dim. août 27, 2017 9:13 pm

au fait,
non ca ne changeait rien car dans pari cette definition de long est placee avant la definition des GEN du coup la tienne ne deviens plus la meme que dans pari.

frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: mingw et pari

Message par frederic han » mar. août 29, 2017 4:36 pm

Bon ca compile, mais il y a des problemes d'interface entre pari et giac que je n'ai aps en 32bits:
(donc toujours pour la version 64bits windows) j'ai:

Code : Tout sélectionner

pari()
pari(2^64) // donne 1

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

Re: mingw et pari

Message par parisse » mar. août 29, 2017 8:06 pm

essaie de rajouter un !defined qui correspond a ta config a la ligne 143 de pari.cc

frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: mingw et pari

Message par frederic han » mer. août 30, 2017 12:01 am

En fait avec x86_64-w64-mingw32-gcc (gcc 6.3) j'ai à la fois WIN32 et WIN64 qui sont definis.
donc a la ligne 143 j'ai mis:

Code : Tout sélectionner

#if !defined(__APPLE__) && !defined(WIN32) || defined(WIN64)
ce qui améliore bien la situation pour pari(2^64).

En revanche il me reste ce soucis:

Code : Tout sélectionner

B:=matrix[[1,58,1387,17715,131260,578697,1538013,2648041,3687447,4993299,5858116,5979221,5239798,4098561,3176188,1660466,705432]];
B*transpose(B);
donne sous win64

Code : Tout sélectionner

matrix[[33788930686]]
au lieu de
matrix[[175925584603774]] sous linux

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

Re: mingw et pari

Message par parisse » mer. août 30, 2017 6:33 am

La, je ne vois rien d'evident, il faudrait debugguer.

frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: mingw et pari

Message par frederic han » mer. août 30, 2017 8:45 am

En fait le problème vient du produit de matrice sous win64:

Code : Tout sélectionner

v:=[1,58,1387,17715,131260,578697,1538013,2648041,3687447,4993299,5858116,5979221,5239798,4098561,3176188,1660466,705432];
v*v; // OK
v*transpose([v]); // OK
[v]*transpose([v]); // Faux
du coup j'ai essayé cela dans mmult_int (ligne 4346 de vecteur.cc)

Code : Tout sélectionner

#if defined(x86_64) && !defined(WIN64) //fred
		if (x>=0)
		  mpz_add_ui(*tmp._ZINTptr,*tmp._ZINTptr,x);
		else
		  mpz_sub_ui(*tmp._ZINTptr,*tmp._ZINTptr,-x);
#else
		tmp += gen(x);
		tmp.uncoerce();
#endif
et ca regle les problèmes! je vais regarder si je n'ai pas unproblème de mélange de plusieurs libgmp.

Edit: bon ca n'a pas l'air d'etre un mélange de libgmp, sans cette modification le probème persiste même avec --disable-pari

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

Re: mingw et pari

Message par parisse » mer. août 30, 2017 9:06 am

Ok, j'incorpore ta modif.

Répondre