source: git/Singular/misc_ip.cc @ d828d63

jengelh-datetimespielwiese
Last change on this file since d828d63 was d828d63, checked in by Hans Schoenemann <hannes@…>, 11 years ago
removed MPSR stuff
  • Property mode set to 100644
File size: 28.9 KB
Line 
1/*****************************************************************************\
2 * Computer Algebra System SINGULAR
3\*****************************************************************************/
4/** @file misc_ip.cc
5 *
6 * This file provides miscellaneous functionality.
7 *
8 * For more general information, see the documentation in misc_ip.h.
9 *
10 **/
11/*****************************************************************************/
12
13// include header files
14#include <misc/auxiliary.h>
15#include "config.h"
16#include <kernel/mod2.h>
17
18#ifdef HAVE_FACTORY
19#define SI_DONT_HAVE_GLOBAL_VARS
20#include <factory/factory.h>
21#endif
22
23#include <coeffs/si_gmp.h>
24#include <coeffs/coeffs.h>
25
26#include <polys/ext_fields/algext.h>
27#include <polys/ext_fields/transext.h>
28
29#include "misc_ip.h"
30#include "ipid.h"
31#include "feOpt.h"
32#include "silink.h"
33
34// the following 2 inline functions are just convenience shortcuts for Frank's code:
35static inline void number2mpz(number n, mpz_t m){ n_MPZ(m, n, coeffs_BIGINT); }
36static inline number mpz2number(mpz_t m){ return n_InitMPZ(m, coeffs_BIGINT); }
37
38
39void divTimes(mpz_t n, mpz_t d, int* times)
40{
41  *times = 0;
42  mpz_t r; mpz_init(r);
43  mpz_t q; mpz_init(q);
44  mpz_fdiv_qr(q, r, n, d);
45  while (mpz_cmp_ui(r, 0) == 0)
46  {
47    (*times)++;
48    mpz_set(n, q);
49    mpz_fdiv_qr(q, r, n, d);
50  }
51  mpz_clear(r);
52  mpz_clear(q);
53}
54
55void divTimes_ui(mpz_t n, unsigned long d, int* times)
56{
57  *times = 0;
58  mpz_t r; mpz_init(r);
59  mpz_t q; mpz_init(q);
60  mpz_fdiv_qr_ui(q, r, n, d);
61  while (mpz_cmp_ui(r, 0) == 0)
62  {
63    (*times)++;
64    mpz_set(n, q);
65    mpz_fdiv_qr_ui(q, r, n, d);
66  }
67  mpz_clear(r);
68  mpz_clear(q);
69}
70
71static inline void divTimes_ui_ui(unsigned long *n, unsigned long d, int* times)
72{
73  *times = 0;
74  unsigned long q=(*n) / d;
75  unsigned long r=(*n) % d;
76  while (r==0)
77  {
78    (*times)++;
79    (*n)=q;
80    q=(*n)/d; r=(*n)%d;
81  }
82}
83
84void setListEntry(lists L, int index, mpz_t n)
85{ /* assumes n > 0 */
86  /* try to fit nn into an int: */
87  if (mpz_size1(n)<=1)
88  {
89    int ui=(int)mpz_get_si(n);
90    if ((((ui<<3)>>3)==ui)
91    && (mpz_cmp_si(n,(long)ui)==0))
92    {
93      L->m[index].rtyp = INT_CMD; L->m[index].data = (void*)ui;
94      return;
95    }
96  }
97  number nn = mpz2number(n);
98  L->m[index].rtyp = BIGINT_CMD; L->m[index].data = (void*)nn;
99}
100
101void setListEntry_ui(lists L, int index, unsigned long ui)
102{ /* assumes n > 0 */
103  /* try to fit nn into an int: */
104  int i=(int)ui;
105  if ((((unsigned long)i)==ui) && (((i<<3)>>3)==i))
106  {
107    L->m[index].rtyp = INT_CMD; L->m[index].data = (void*)i;
108  }
109  else
110  {
111    number nn = n_Init(ui, coeffs_BIGINT);
112    L->m[index].rtyp = BIGINT_CMD; L->m[index].data = (void*)nn;
113  }
114}
115
116/* true iff p is prime */
117/*
118bool isPrime(mpz_t p)
119{
120  if (mpz_cmp_ui(p, 2) == 0) return true;
121  if (mpz_cmp_ui(p, 3) == 0) return true;
122  if (mpz_cmp_ui(p, 5) < 0)  return false;
123
124  mpz_t d; mpz_init_set_ui(d, 5); int add = 2;
125  mpz_t sr; mpz_init(sr); mpz_sqrt(sr, p);
126  mpz_t r; mpz_init(r);
127  while (mpz_cmp(d, sr) <= 0)
128  {
129    mpz_cdiv_r(r, p, d);
130    if (mpz_cmp_ui(r, 0) == 0)
131    {
132      mpz_clear(d); mpz_clear(sr); mpz_clear(r);
133      return false;
134    }
135    mpz_add_ui(d, d, add);
136    add += 2; if (add == 6) add = 2;
137  }
138  mpz_clear(d); mpz_clear(sr); mpz_clear(r);
139  return true;
140}
141*/
142
143/* finds the next prime q, bound >= q >= p;
144   in case of success, puts q into p;
145   otherwise sets q = bound + 1;
146   e.g. p = 24; nextPrime(p, 30) produces p = 29 (success),
147        p = 24; nextPrime(p, 29) produces p = 29 (success),
148        p = 24; nextPrime(p, 28) produces p = 29 (no success),
149        p = 24; nextPrime(p, 27) produces p = 28 (no success) */
150/*
151void nextPrime(mpz_t p, mpz_t bound)
152{
153  int add;
154  mpz_t r; mpz_init(r); mpz_cdiv_r_ui(r, p, 6); // r = p mod 6, 0 <= r <= 5
155  if (mpz_cmp_ui(r, 0) == 0) { mpz_add_ui(p, p, 1); add = 4; }
156  if (mpz_cmp_ui(r, 1) == 0) {                      add = 4; }
157  if (mpz_cmp_ui(r, 2) == 0) { mpz_add_ui(p, p, 3); add = 2; }
158  if (mpz_cmp_ui(r, 3) == 0) { mpz_add_ui(p, p, 2); add = 2; }
159  if (mpz_cmp_ui(r, 4) == 0) { mpz_add_ui(p, p, 1); add = 2; }
160  if (mpz_cmp_ui(r, 5) == 0) {                      add = 2; }
161
162  while (mpz_cmp(p, bound) <= 0)
163  {
164    if (isPrime(p)) { mpz_clear(r); return; }
165    mpz_add_ui(p, p, add);
166    add += 2; if (add == 6) add = 2;
167  }
168  mpz_set(p, bound);
169  mpz_add_ui(p, p, 1);
170  mpz_clear(r);
171  return;
172}
173*/
174
175
176
177/* n and pBound are assumed to be bigint numbers */
178lists primeFactorisation(const number n, const number pBound)
179{
180  mpz_t nn; number2mpz(n, nn);
181  mpz_t pb; number2mpz(pBound, pb);
182  mpz_t b; number2mpz(pBound, b);
183  mpz_t p; mpz_init(p); int tt;
184  mpz_t sr; mpz_init(sr); int index = 0; int add;
185  lists primes = (lists)omAllocBin(slists_bin); primes->Init(1000);
186  int* multiplicities = new int[1000];
187  int positive=1; int probTest = 0;
188
189  if (!n_IsZero(n, coeffs_BIGINT))
190  {
191    if (!n_GreaterZero(n, coeffs_BIGINT))
192    {
193      positive=-1;
194      mpz_neg(nn,nn);
195    }
196    divTimes_ui(nn, 2, &tt);
197    if (tt > 0)
198    {
199      setListEntry_ui(primes, index, 2);
200      multiplicities[index++] = tt;
201    }
202
203    divTimes_ui(nn, 3, &tt);
204    if (tt > 0)
205    {
206      setListEntry_ui(primes, index, 3);
207      multiplicities[index++] = tt;
208    }
209
210    unsigned long p_ui=5; add = 2;
211    BOOLEAN b_is_0=(mpz_cmp_ui(b, 0) == 0);
212    BOOLEAN sr_sets_pb=FALSE;
213    mpz_sqrt(sr, nn);
214    // there are 3 possible limits, we take the minimum:
215    // - argument pBound (if >0)
216    // - sr = sqrt(nn)
217    // - 1<<31
218    unsigned long  limit=~(0L);
219    if (b_is_0 || (mpz_cmp(pb, sr) > 0))
220    {
221      mpz_set(pb, sr);
222      sr_sets_pb=TRUE;
223    }
224    if (mpz_cmp_ui(pb, limit)<0)
225    {
226     limit=mpz_get_ui(pb);
227    }
228    else
229    {
230      mpz_set_ui(pb,limit);
231    }
232    while (p_ui <=limit)
233    {
234      divTimes_ui(nn, p_ui, &tt);
235      if (tt > 0)
236      {
237        setListEntry_ui(primes, index, p_ui);
238        multiplicities[index++] = tt;
239        //mpz_sqrt(sr, nn);
240        //if ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
241        if (mpz_size1(nn)<=2)
242        {
243          mpz_sqrt(sr, nn);
244          if (sr_sets_pb || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
245          unsigned long l=mpz_get_ui(sr);
246          if (l<limit) { limit=l; }
247          if (mpz_size1(nn)<=1)
248          {
249            unsigned long nn_ui=mpz_get_ui(nn);
250            while (p_ui <=limit)
251            {
252              divTimes_ui_ui(&nn_ui, p_ui, &tt);
253              if (tt > 0)
254              {
255                setListEntry_ui(primes, index, p_ui);
256                multiplicities[index++] = tt;
257                if (nn_ui==1) break;
258                if (nn_ui<(limit/6)) { limit=nn_ui/6;}
259              }
260              p_ui +=add;
261              //add += 2; if (add == 6) add = 2;
262              add =2+2*(add==2);
263            }
264            mpz_set_ui(nn,nn_ui);
265            break;
266          }
267        }
268      }
269      p_ui +=add;
270      //add += 2; if (add == 6) add = 2;
271      add =2+2*(add==2);
272    }
273    mpz_set_ui(p, p_ui);
274    mpz_sqrt(sr, nn);
275    if (b_is_0 || sr_sets_pb || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
276    while (mpz_cmp(pb, p) >= 0)
277    {
278      divTimes(nn, p, &tt);
279      if (tt > 0)
280      {
281        setListEntry(primes, index, p);
282        multiplicities[index++] = tt;
283        if (mpz_cmp_ui(nn,1)==0) break;
284        mpz_sqrt(sr, nn);
285        if (b_is_0 || sr_sets_pb || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
286      }
287      mpz_add_ui(p, p, add);
288      //add += 2; if (add == 6) add = 2;
289      add =2+2*(add==2);
290    }
291    if ((mpz_cmp_ui(nn, 1) > 0) &&
292        (b_is_0 || (mpz_cmp(nn, b) <= 0)))
293    {
294      setListEntry(primes, index, nn);
295      multiplicities[index++] = 1;
296      mpz_set_ui(nn, 1);
297    }
298    if ((mpz_cmp_ui(nn, 1) > 0) && (mpz_probab_prime_p(nn, 25) != 0))
299      probTest = 1;
300  }
301
302  lists primesL = (lists)omAllocBin(slists_bin);
303  primesL->Init(index);
304  for (int i = 0; i < index; i++)
305  {
306    primesL->m[i].rtyp = primes->m[i].rtyp;
307    primesL->m[i].data = primes->m[i].data;
308  }
309  omFreeSize((ADDRESS)primes->m, (primes->nr + 1) * sizeof(sleftv));
310  omFreeBin((ADDRESS)primes, slists_bin);
311
312  lists multiplicitiesL = (lists)omAllocBin(slists_bin);
313  multiplicitiesL->Init(index);
314  for (int i = 0; i < index; i++)
315  {
316    multiplicitiesL->m[i].rtyp = INT_CMD;
317    multiplicitiesL->m[i].data = (void*)multiplicities[i];
318  }
319  delete[] multiplicities;
320
321  lists L=(lists)omAllocBin(slists_bin);
322  L->Init(4);
323  if (positive==-1) mpz_neg(nn,nn);
324  L->m[0].rtyp = LIST_CMD; L->m[0].data = (void*)primesL;
325  L->m[1].rtyp = LIST_CMD; L->m[1].data = (void*)multiplicitiesL;
326  setListEntry(L, 2, nn);
327  L->m[3].rtyp =  INT_CMD; L->m[3].data = (void*)probTest;
328  mpz_clear(nn); mpz_clear(pb); mpz_clear(b); mpz_clear(p); mpz_clear(sr);
329
330  return L;
331}
332
333#include <omalloc/omalloc.h>
334#include <misc/mylimits.h>
335
336#include <misc/options.h>
337#include <misc/intvec.h>
338
339#include <polys/monomials/ring.h>
340#include <polys/templates/p_Procs.h>
341
342#include <kernel/febase.h>
343#include <kernel/page.h>
344#include <kernel/kstd1.h>
345#include <kernel/timer.h>
346
347
348#include "subexpr.h"
349#include "cntrlc.h"
350#include "ipid.h"
351#include "ipshell.h"
352
353#include "version.h"
354#include "static.h"
355
356#include "fehelp.h"
357
358#ifdef HAVE_STATIC
359#undef HAVE_DYN_RL
360#endif
361
362#define SI_DONT_HAVE_GLOBAL_VARS
363
364//#ifdef HAVE_LIBPARSER
365//#  include "libparse.h"
366//#endif /* HAVE_LIBPARSER */
367
368
369/*2
370* the renice routine for very large jobs
371* works only on unix machines,
372* testet on : linux, HP 9.0
373*
374*#include <sys/times.h>
375*#include <sys/resource.h>
376*extern "C" int setpriority(int,int,int);
377*void very_nice()
378*{
379*#ifndef NO_SETPRIORITY
380*  setpriority(PRIO_PROCESS,0,19);
381*#endif
382*  sleep(10);
383*}
384*/
385
386#include <string.h>
387#include <unistd.h>
388#include <stdio.h>
389#include <stddef.h>
390#include <stdlib.h>
391#include <time.h>
392
393
394void singular_example(char *str)
395{
396  assume(str!=NULL);
397  char *s=str;
398  while (*s==' ') s++;
399  char *ss=s;
400  while (*ss!='\0') ss++;
401  while (*ss<=' ')
402  {
403    *ss='\0';
404    ss--;
405  }
406  idhdl h=IDROOT->get(s,myynest);
407  if ((h!=NULL) && (IDTYP(h)==PROC_CMD))
408  {
409    char *lib=iiGetLibName(IDPROC(h));
410    if((lib!=NULL)&&(*lib!='\0'))
411    {
412      Print("// proc %s from lib %s\n",s,lib);
413      s=iiGetLibProcBuffer(IDPROC(h), 2);
414      if (s!=NULL)
415      {
416        if (strlen(s)>5)
417        {
418          iiEStart(s,IDPROC(h));
419          omFree((ADDRESS)s);
420          return;
421        }
422        else omFree((ADDRESS)s);
423      }
424    }
425  }
426  else
427  {
428    char sing_file[MAXPATHLEN];
429    FILE *fd=NULL;
430    char *res_m=feResource('m', 0);
431    if (res_m!=NULL)
432    {
433      sprintf(sing_file, "%s/%s.sing", res_m, s);
434      fd = feFopen(sing_file, "r");
435    }
436    if (fd != NULL)
437    {
438
439      int old_echo = si_echo;
440      int length, got;
441      char* s;
442
443      fseek(fd, 0, SEEK_END);
444      length = ftell(fd);
445      fseek(fd, 0, SEEK_SET);
446      s = (char*) omAlloc((length+20)*sizeof(char));
447      got = fread(s, sizeof(char), length, fd);
448      fclose(fd);
449      if (got != length)
450      {
451        Werror("Error while reading file %s", sing_file);
452      }
453      else
454      {
455        s[length] = '\0';
456        strcat(s, "\n;return();\n\n");
457        si_echo = 2;
458        iiEStart(s, NULL);
459        si_echo = old_echo;
460      }
461      omFree(s);
462    }
463    else
464    {
465      Werror("no example for %s", str);
466    }
467  }
468}
469
470
471struct soptionStruct
472{
473  const char * name;
474  unsigned   setval;
475  unsigned   resetval;
476};
477
478struct soptionStruct optionStruct[]=
479{
480  {"prot",         Sy_bit(OPT_PROT),           ~Sy_bit(OPT_PROT)   },
481  {"redSB",        Sy_bit(OPT_REDSB),          ~Sy_bit(OPT_REDSB)   },
482  {"notBuckets",   Sy_bit(OPT_NOT_BUCKETS),    ~Sy_bit(OPT_NOT_BUCKETS)   },
483  {"notSugar",     Sy_bit(OPT_NOT_SUGAR),      ~Sy_bit(OPT_NOT_SUGAR)   },
484  {"interrupt",    Sy_bit(OPT_INTERRUPT),      ~Sy_bit(OPT_INTERRUPT)   },
485  {"sugarCrit",    Sy_bit(OPT_SUGARCRIT),      ~Sy_bit(OPT_SUGARCRIT)   },
486  {"teach",        Sy_bit(OPT_DEBUG),          ~Sy_bit(OPT_DEBUG)  },
487  {"notSyzMinim",  Sy_bit(OPT_NO_SYZ_MINIM),   ~Sy_bit(OPT_NO_SYZ_MINIM)  },
488  /* 9 return SB in syz, quotient, intersect */
489  {"returnSB",     Sy_bit(OPT_RETURN_SB),      ~Sy_bit(OPT_RETURN_SB)  },
490  {"fastHC",       Sy_bit(OPT_FASTHC),         ~Sy_bit(OPT_FASTHC)  },
491  /* 11-19 sort in L/T */
492  {"staircaseBound",Sy_bit(OPT_STAIRCASEBOUND),~Sy_bit(OPT_STAIRCASEBOUND)  },
493  {"multBound",    Sy_bit(OPT_MULTBOUND),      ~Sy_bit(OPT_MULTBOUND)  },
494  {"degBound",     Sy_bit(OPT_DEGBOUND),       ~Sy_bit(OPT_DEGBOUND)  },
495  /* 25 no redTail(p)/redTail(s) */
496  {"redTail",      Sy_bit(OPT_REDTAIL),        ~Sy_bit(OPT_REDTAIL)  },
497  {"redThrough",   Sy_bit(OPT_REDTHROUGH),     ~Sy_bit(OPT_REDTHROUGH)  },
498  {"lazy",         Sy_bit(OPT_OLDSTD),         ~Sy_bit(OPT_OLDSTD)  },
499  {"intStrategy",  Sy_bit(OPT_INTSTRATEGY),    ~Sy_bit(OPT_INTSTRATEGY)  },
500  {"infRedTail",   Sy_bit(OPT_INFREDTAIL),     ~Sy_bit(OPT_INFREDTAIL)  },
501  /* 30: use not regularity for syz */
502  {"notRegularity",Sy_bit(OPT_NOTREGULARITY),  ~Sy_bit(OPT_NOTREGULARITY)  },
503  {"weightM",      Sy_bit(OPT_WEIGHTM),        ~Sy_bit(OPT_WEIGHTM)  },
504/*special for "none" and also end marker for showOption:*/
505  {"ne",           0,                          0 }
506};
507
508struct soptionStruct verboseStruct[]=
509{
510  {"mem",      Sy_bit(V_SHOW_MEM),  ~Sy_bit(V_SHOW_MEM)   },
511  {"yacc",     Sy_bit(V_YACC),      ~Sy_bit(V_YACC)       },
512  {"redefine", Sy_bit(V_REDEFINE),  ~Sy_bit(V_REDEFINE)   },
513  {"reading",  Sy_bit(V_READING),   ~Sy_bit(V_READING)    },
514  {"loadLib",  Sy_bit(V_LOAD_LIB),  ~Sy_bit(V_LOAD_LIB)   },
515  {"debugLib", Sy_bit(V_DEBUG_LIB), ~Sy_bit(V_DEBUG_LIB)  },
516  {"loadProc", Sy_bit(V_LOAD_PROC), ~Sy_bit(V_LOAD_PROC)  },
517  {"defRes",   Sy_bit(V_DEF_RES),   ~Sy_bit(V_DEF_RES)    },
518  {"usage",    Sy_bit(V_SHOW_USE),  ~Sy_bit(V_SHOW_USE)   },
519  {"Imap",     Sy_bit(V_IMAP),      ~Sy_bit(V_IMAP)       },
520  {"prompt",   Sy_bit(V_PROMPT),    ~Sy_bit(V_PROMPT)     },
521  {"length",   Sy_bit(V_LENGTH),    ~Sy_bit(V_LENGTH)     },
522  {"notWarnSB",Sy_bit(V_NSB),       ~Sy_bit(V_NSB)        },
523  {"contentSB",Sy_bit(V_CONTENTSB), ~Sy_bit(V_CONTENTSB)  },
524  {"cancelunit",Sy_bit(V_CANCELUNIT),~Sy_bit(V_CANCELUNIT)},
525  {"modpsolve",Sy_bit(V_MODPSOLVSB),~Sy_bit(V_MODPSOLVSB)},
526  {"geometricSB",Sy_bit(V_UPTORADICAL),~Sy_bit(V_UPTORADICAL)},
527  {"findMonomials",Sy_bit(V_FINDMONOM),~Sy_bit(V_FINDMONOM)},
528  {"coefStrat",Sy_bit(V_COEFSTRAT), ~Sy_bit(V_COEFSTRAT)},
529  {"qringNF",  Sy_bit(V_QRING),     ~Sy_bit(V_QRING)},
530  {"warn",     Sy_bit(V_ALLWARN),   ~Sy_bit(V_ALLWARN)},
531  {"interedSyz",Sy_bit(V_INTERSECT_SYZ), ~Sy_bit(V_INTERSECT_SYZ)},
532  {"interedElim",Sy_bit(V_INTERSECT_ELIM), ~Sy_bit(V_INTERSECT_ELIM)},
533/*special for "none" and also end marker for showOption:*/
534  {"ne",         0,          0 }
535};
536
537BOOLEAN setOption(leftv res, leftv v)
538{
539  const char *n;
540  do
541  {
542    if (v->Typ()==STRING_CMD)
543    {
544      n=(const char *)v->CopyD(STRING_CMD);
545    }
546    else
547    {
548      if (v->name==NULL)
549        return TRUE;
550      if (v->rtyp==0)
551      {
552        n=v->name;
553        v->name=NULL;
554      }
555      else
556      {
557        n=omStrDup(v->name);
558      }
559    }
560
561    int i;
562
563    if(strcmp(n,"get")==0)
564    {
565      intvec *w=new intvec(2);
566      (*w)[0]=test;
567      (*w)[1]=verbose;
568      res->rtyp=INTVEC_CMD;
569      res->data=(void *)w;
570      goto okay;
571    }
572    if(strcmp(n,"set")==0)
573    {
574      if((v->next!=NULL)
575      &&(v->next->Typ()==INTVEC_CMD))
576      {
577        v=v->next;
578        intvec *w=(intvec*)v->Data();
579        test=(*w)[0];
580        verbose=(*w)[1];
581#if 0
582        if (TEST_OPT_INTSTRATEGY && (currRing!=NULL)
583        && rField_has_simple_inverse()
584#ifdef HAVE_RINGS
585        && !rField_is_Ring(currRing)
586#endif
587        ) {
588          test &=~Sy_bit(OPT_INTSTRATEGY);
589        }
590#endif
591        goto okay;
592      }
593    }
594    if(strcmp(n,"none")==0)
595    {
596      test=0;
597      verbose=0;
598      goto okay;
599    }
600    for (i=0; (i==0) || (optionStruct[i-1].setval!=0); i++)
601    {
602      if (strcmp(n,optionStruct[i].name)==0)
603      {
604        if (optionStruct[i].setval & validOpts)
605        {
606          test |= optionStruct[i].setval;
607          // optOldStd disables redthrough
608          if (optionStruct[i].setval == Sy_bit(OPT_OLDSTD))
609            test &= ~Sy_bit(OPT_REDTHROUGH);
610        }
611        else
612          Warn("cannot set option");
613#if 0
614        if (TEST_OPT_INTSTRATEGY && (currRing!=NULL)
615        && rField_has_simple_inverse()
616#ifdef HAVE_RINGS
617        && !rField_is_Ring(currRing)
618#endif
619        ) {
620          test &=~Sy_bit(OPT_INTSTRATEGY);
621        }
622#endif
623        goto okay;
624      }
625      else if ((strncmp(n,"no",2)==0)
626      && (strcmp(n+2,optionStruct[i].name)==0))
627      {
628        if (optionStruct[i].setval & validOpts)
629        {
630          test &= optionStruct[i].resetval;
631        }
632        else
633          Warn("cannot clear option");
634        goto okay;
635      }
636    }
637    for (i=0; (i==0) || (verboseStruct[i-1].setval!=0); i++)
638    {
639      if (strcmp(n,verboseStruct[i].name)==0)
640      {
641        verbose |= verboseStruct[i].setval;
642        #ifdef YYDEBUG
643        #if YYDEBUG
644        /*debugging the bison grammar --> grammar.cc*/
645        extern int    yydebug;
646        if (BVERBOSE(V_YACC)) yydebug=1;
647        else                  yydebug=0;
648        #endif
649        #endif
650        goto okay;
651      }
652      else if ((strncmp(n,"no",2)==0)
653      && (strcmp(n+2,verboseStruct[i].name)==0))
654      {
655        verbose &= verboseStruct[i].resetval;
656        #ifdef YYDEBUG
657        #if YYDEBUG
658        /*debugging the bison grammar --> grammar.cc*/
659        extern int    yydebug;
660        if (BVERBOSE(V_YACC)) yydebug=1;
661        else                  yydebug=0;
662        #endif
663        #endif
664        goto okay;
665      }
666    }
667    Werror("unknown option `%s`",n);
668  okay:
669    if (currRing != NULL)
670      currRing->options = test & TEST_RINGDEP_OPTS;
671    omFree((ADDRESS)n);
672    v=v->next;
673  } while (v!=NULL);
674
675#ifdef OM_SINGULAR_CONFIG_H
676   // set global variable to show memory usage
677  extern int om_sing_opt_show_mem;
678  if (BVERBOSE(V_SHOW_MEM)) om_sing_opt_show_mem = 1;
679  else om_sing_opt_show_mem = 0;
680#endif
681
682  return FALSE;
683}
684
685char * showOption()
686{
687  int i;
688  BITSET tmp;
689
690  StringSetS("//options:");
691  if ((test!=0)||(verbose!=0))
692  {
693    tmp=test;
694    if(tmp)
695    {
696      for (i=0; optionStruct[i].setval!=0; i++)
697      {
698        if (optionStruct[i].setval & test)
699        {
700          StringAppend(" %s",optionStruct[i].name);
701          tmp &=optionStruct[i].resetval;
702        }
703      }
704      for (i=0; i<32; i++)
705      {
706        if (tmp & Sy_bit(i)) StringAppend(" %d",i);
707      }
708    }
709    tmp=verbose;
710    if (tmp)
711    {
712      for (i=0; verboseStruct[i].setval!=0; i++)
713      {
714        if (verboseStruct[i].setval & tmp)
715        {
716          StringAppend(" %s",verboseStruct[i].name);
717          tmp &=verboseStruct[i].resetval;
718        }
719      }
720      for (i=1; i<32; i++)
721      {
722        if (tmp & Sy_bit(i)) StringAppend(" %d",i+32);
723      }
724    }
725    return omStrDup(StringAppendS(""));
726  }
727  else
728    return omStrDup(StringAppendS(" none"));
729}
730
731char * versionString()
732{
733  char* str = StringSetS("");
734  StringAppend("Singular for %s version %s (%d-%s)  %s\nwith\n",
735               S_UNAME, S_VERSION1, SINGULAR_VERSION,
736               feVersionId,singular_date);
737  StringAppendS("\t");
738#ifdef HAVE_FACTORY
739  StringAppend("factory(%s)", factoryVersion);
740#ifdef HAVE_LIBFAC
741  // libfac:
742//  extern const char * libfac_version;
743//  extern const char * libfac_date;
744  StringAppend("+libfac");
745#endif // #ifdef HAVE_LIBFAC
746  StringAppend(",");
747#endif
748
749#if defined (__GNU_MP_VERSION) && defined (__GNU_MP_VERSION_MINOR)
750              StringAppend("GMP(%d.%d),",__GNU_MP_VERSION,__GNU_MP_VERSION_MINOR);
751#else
752              StringAppendS("GMP(1.3),");
753#endif
754#ifdef HAVE_NTL
755#include <NTL/version.h>
756              StringAppend("NTL(%s),",NTL_VERSION);
757#endif
758#if SIZEOF_VOIDP == 8
759              StringAppendS("64bit,");
760#else
761              StringAppendS("32bit,");
762#endif
763#if defined(HAVE_DYN_RL)
764              if (fe_fgets_stdin==fe_fgets_dummy)
765                StringAppendS("no input,");
766              else if (fe_fgets_stdin==fe_fgets)
767                StringAppendS("fgets,");
768              if (fe_fgets_stdin==fe_fgets_stdin_drl)
769                StringAppendS("dynamic readline,");
770              #ifdef HAVE_FEREAD
771              else if (fe_fgets_stdin==fe_fgets_stdin_emu)
772                StringAppendS("emulated readline,");
773              #endif
774              else
775                StringAppendS("unknown fgets method,");
776#else
777  #if defined(HAVE_READLINE) && !defined(FEREAD)
778              StringAppendS("static readline,");
779  #else
780    #ifdef HAVE_FEREAD
781              StringAppendS("emulated readline,");
782    #else
783              StringAppendS("fgets,");
784    #endif
785  #endif
786#endif
787#ifdef HAVE_PLURAL
788              StringAppendS("Plural,");
789#endif
790#ifdef HAVE_DBM
791              StringAppendS("DBM,\n\t");
792#else
793              StringAppendS("\n\t");
794#endif
795#ifdef HAVE_DYNAMIC_LOADING
796              StringAppendS("dynamic modules,");
797#endif
798              if (p_procs_dynamic) StringAppendS("dynamic p_Procs,");
799#ifdef TEST
800              StringAppendS("TESTs,");
801#endif
802#if YYDEBUG
803              StringAppendS("YYDEBUG=1,");
804#endif
805#ifdef HAVE_ASSUME
806             StringAppendS("ASSUME,");
807#endif
808#ifdef MDEBUG
809              StringAppend("MDEBUG=%d,",MDEBUG);
810#endif
811#ifdef OM_CHECK
812              StringAppend("OM_CHECK=%d,",OM_CHECK);
813#endif
814#ifdef OM_TRACK
815              StringAppend("OM_TRACK=%d,",OM_TRACK);
816#endif
817#ifdef OM_NDEBUG
818              StringAppendS("OM_NDEBUG,");
819#endif
820#ifdef PDEBUG
821              StringAppendS("PDEBUG,");
822#endif
823#ifdef KDEBUG
824              StringAppendS("KDEBUG,");
825#endif
826#ifndef __OPTIMIZE__
827              StringAppendS("-g,");
828#endif
829#ifdef HAVE_EIGENVAL
830              StringAppendS("eigenvalues,");
831#endif
832#ifdef HAVE_GMS
833              StringAppendS("Gauss-Manin system,");
834#endif
835#ifdef HAVE_RATGRING
836              StringAppendS("ratGB,");
837#endif
838              StringAppend("random=%d\n",siRandomStart);
839              StringAppend("\tCC=%s,\n\tCXX=%s"
840#ifdef __GNUC__
841              "(" __VERSION__ ")"
842#endif
843              "\n",CC,CXX);
844              feStringAppendResources(0);
845              feStringAppendBrowsers(0);
846              StringAppendS("\n");
847              return str;
848}
849
850#ifdef PDEBUG
851#if (OM_TRACK > 2) && defined(OM_TRACK_CUSTOM)
852void p_SetRingOfLeftv(leftv l, ring r)
853{
854  switch(l->rtyp)
855  {
856    case INT_CMD:
857    case BIGINT_CMD:
858    case IDHDL:
859    case DEF_CMD:
860      break;
861    case POLY_CMD:
862    case VECTOR_CMD:
863    {
864      poly p=(poly)l->data;
865      while(p!=NULL) { p_SetRingOfLm(p,r); pIter(p); }
866      break;
867    }
868    case IDEAL_CMD:
869    case MODUL_CMD:
870    case MATRIX_CMD:
871    {
872      ideal I=(ideal)l->data;
873      int i;
874      for(i=IDELEMS(I)-1;i>=0;i--)
875      {
876        poly p=I->m[i];
877        while(p!=NULL) { p_SetRingOfLm(p,r); pIter(p); }
878      }
879      break;
880    }
881    case COMMAND:
882    {
883      command d=(command)l->data;
884      p_SetRingOfLeftv(&d->arg1, r);
885      if (d->argc>1) p_SetRingOfLeftv(&d->arg2, r);
886      if (d->argc>2) p_SetRingOfLeftv(&d->arg3, r);
887      break;
888    }
889    default:
890     printf("type %d not yet implementd in p_SetRingOfLeftv\n",l->rtyp);
891     break;
892  }
893}
894#endif
895#endif
896
897#if 0 /* debug only */
898void listall(int showproc)
899{
900      idhdl hh=basePack->idroot;
901      PrintS("====== Top ==============\n");
902      while (hh!=NULL)
903      {
904        if (showproc || (IDTYP(hh)!=PROC_CMD))
905        {
906          if (IDDATA(hh)==(void *)currRing) PrintS("(R)");
907          else if (IDDATA(hh)==(void *)currPack) PrintS("(P)");
908          else PrintS("   ");
909          Print("::%s, typ %s level %d data %lx",
910                 IDID(hh),Tok2Cmdname(IDTYP(hh)),IDLEV(hh),(long)IDDATA(hh));
911          if ((IDTYP(hh)==RING_CMD)
912          || (IDTYP(hh)==QRING_CMD))
913            Print(" ref: %d\n",IDRING(hh)->ref);
914          else
915            PrintLn();
916        }
917        hh=IDNEXT(hh);
918      }
919      hh=basePack->idroot;
920      while (hh!=NULL)
921      {
922        if (IDDATA(hh)==(void *)basePack)
923          Print("(T)::%s, typ %s level %d data %lx\n",
924          IDID(hh),Tok2Cmdname(IDTYP(hh)),IDLEV(hh),(long)IDDATA(hh));
925        else
926        if ((IDTYP(hh)==RING_CMD)
927        || (IDTYP(hh)==QRING_CMD)
928        || (IDTYP(hh)==PACKAGE_CMD))
929        {
930          Print("====== %s ==============\n",IDID(hh));
931          idhdl h2=IDRING(hh)->idroot;
932          while (h2!=NULL)
933          {
934            if (showproc || (IDTYP(h2)!=PROC_CMD))
935            {
936              if ((IDDATA(h2)==(void *)currRing)
937              && ((IDTYP(h2)==RING_CMD)||(IDTYP(h2)==QRING_CMD)))
938                PrintS("(R)");
939              else if (IDDATA(h2)==(void *)currPack) PrintS("(P)");
940              else PrintS("   ");
941              Print("%s::%s, typ %s level %d data %lx\n",
942              IDID(hh),IDID(h2),Tok2Cmdname(IDTYP(h2)),IDLEV(h2),(long)IDDATA(h2));
943            }
944            h2=IDNEXT(h2);
945          }
946        }
947        hh=IDNEXT(hh);
948      }
949      Print("currRing:%lx, currPack:%lx,basePack:%lx\n",(long)currRing,(long)currPack,(long)basePack);
950      iiCheckPack(currPack);
951}
952#endif
953
954#ifndef NDEBUG
955void checkall()
956{
957      idhdl hh=basePack->idroot;
958      while (hh!=NULL)
959      {
960        omCheckAddr(hh);
961        omCheckAddr((ADDRESS)IDID(hh));
962        if (RingDependend(IDTYP(hh))) Print("%s typ %d in Top\n",IDID(hh),IDTYP(hh));
963        hh=IDNEXT(hh);
964      }
965      hh=basePack->idroot;
966      while (hh!=NULL)
967      {
968        if (IDTYP(hh)==PACKAGE_CMD)
969        {
970          idhdl h2=IDPACKAGE(hh)->idroot;
971          while (h2!=NULL)
972          {
973            omCheckAddr(h2);
974            omCheckAddr((ADDRESS)IDID(h2));
975            if (RingDependend(IDTYP(h2))) Print("%s typ %d in %s\n",IDID(h2),IDTYP(h2),IDID(hh));
976            h2=IDNEXT(h2);
977          }
978        }
979        hh=IDNEXT(hh);
980      }
981}
982#endif
983
984#include <sys/types.h>
985#include <sys/stat.h>
986#include <unistd.h>
987
988extern "C"
989int singular_fstat(int fd, struct stat *buf)
990{
991  return fstat(fd,buf);
992}
993
994/*2
995* the global exit routine of Singular
996*/
997extern "C" {
998
999void m2_end(int i)
1000{
1001  fe_reset_input_mode();
1002  #ifdef PAGE_TEST
1003  mmEndStat();
1004  #endif
1005  fe_reset_input_mode();
1006  idhdl h = IDROOT;
1007  while(h != NULL)
1008  {
1009    if(IDTYP(h) == LINK_CMD)
1010    {
1011      idhdl hh=h->next;
1012      killhdl(h, currPack);
1013      h = hh;
1014    }
1015    else
1016    {
1017      h = h->next;
1018    }
1019  }
1020  if(!singular_in_batchmode)
1021  {
1022    if (i<=0)
1023    {
1024      if (TEST_V_QUIET)
1025      {
1026        if (i==0)
1027          printf("Auf Wiedersehen.\n");
1028        else
1029          printf("\n$Bye.\n");
1030      }
1031      //#ifdef sun
1032      //  #ifndef __svr4__
1033      //    _cleanup();
1034      //    _exit(0);
1035      //  #endif
1036      //#endif
1037      i=0;
1038    }
1039    else
1040    {
1041        printf("\nhalt %d\n",i);
1042    }
1043  }
1044  exit(i);
1045}
1046}
1047
1048const char *singular_date=__DATE__ " " __TIME__;
1049
1050extern "C"
1051{
1052  void omSingOutOfMemoryFunc()
1053  {
1054    fprintf(stderr, "\nSingular error: no more memory\n");
1055    omPrintStats(stderr);
1056    m2_end(14);
1057    /* should never get here */
1058    exit(1);
1059  }
1060}
1061
1062/*2
1063* initialize components of Singular
1064*/
1065void siInit(char *name)
1066{
1067#ifdef HAVE_FACTORY
1068// factory default settings: -----------------------------------------------
1069  On(SW_USE_NTL);
1070  On(SW_USE_NTL_GCD_0); // On -> seg11 in Old/algnorm, Old/factor...
1071  On(SW_USE_NTL_GCD_P); // On -> cyle in Short/brnoeth_s: fixed
1072  On(SW_USE_EZGCD);
1073  On(SW_USE_CHINREM_GCD);
1074  //On(SW_USE_FF_MOD_GCD);
1075  On(SW_USE_EZGCD_P);
1076  On(SW_USE_QGCD);
1077  Off(SW_USE_NTL_SORT); // may be changed by an command line option
1078  factoryError=WerrorS;
1079#endif
1080
1081// memory initialization: -----------------------------------------------
1082    om_Opts.OutOfMemoryFunc = omSingOutOfMemoryFunc;
1083#ifndef OM_NDEBUG
1084#ifndef __OPTIMIZE__
1085    om_Opts.ErrorHook = dErrorBreak;
1086#endif
1087#endif
1088    omInitInfo();
1089#ifdef OM_SING_KEEP
1090    om_Opts.Keep = OM_SING_KEEP;
1091#endif
1092
1093// interpreter tables etc.: -----------------------------------------------
1094#ifdef INIT_BUG
1095  jjInitTab1();
1096#endif
1097  memset(&sLastPrinted,0,sizeof(sleftv));
1098  sLastPrinted.rtyp=NONE;
1099
1100  extern int iiInitArithmetic(); iiInitArithmetic(); // iparith.cc
1101
1102  basePack=(package)omAlloc0(sizeof(*basePack));
1103  currPack=basePack;
1104  idhdl h;
1105  h=enterid("Top", 0, PACKAGE_CMD, &IDROOT, TRUE);
1106  IDPACKAGE(h)->language = LANG_TOP;
1107  IDPACKAGE(h)=basePack;
1108  currPackHdl=h;
1109  basePackHdl=h;
1110
1111  coeffs_BIGINT = nInitChar(n_Q,NULL);
1112
1113#if 1
1114   // def HAVE_POLYEXTENSIONS
1115  if(TRUE)
1116  {
1117    n_coeffType type = nRegister(n_algExt, naInitChar);
1118    assume(type == n_algExt);
1119
1120    type = nRegister(n_transExt, ntInitChar);
1121    assume(type == n_transExt);
1122  }
1123#endif
1124
1125// random generator: -----------------------------------------------
1126  int t=initTimer();
1127  if (t==0) t=1;
1128  initRTimer();
1129  siSeed=t;
1130#ifdef HAVE_FACTORY
1131  factoryseed(t);
1132#endif
1133  siRandomStart=t;
1134  feOptSpec[FE_OPT_RANDOM].value = (void*) ((long)siRandomStart);
1135
1136// ressource table: ----------------------------------------------------
1137  // Don't worry: ifdef OM_NDEBUG, then all these calls are undef'ed
1138  // hack such that all shared' libs in the bindir are loaded correctly
1139  feInitResources(name);
1140
1141// singular links: --------------------------------------------------
1142  slStandardInit();
1143  myynest=0;
1144
1145// loading standard.lib -----------------------------------------------
1146  if (! feOptValue(FE_OPT_NO_STDLIB))
1147  {
1148    int vv=verbose;
1149    verbose &= ~Sy_bit(V_LOAD_LIB);
1150    iiLibCmd(omStrDup("standard.lib"), TRUE,TRUE,TRUE);
1151    verbose=vv;
1152  }
1153  errorreported = 0;
1154}
1155
1156/*
1157#ifdef LIBSINGULAR
1158#ifdef HAVE_FACTORY
1159// the init routines of factory need mmInit
1160int mmInit( void )
1161{
1162  return 1;
1163}
1164#endif
1165#endif
1166*/
Note: See TracBrowser for help on using the repository browser.