source: git/Singular/misc_ip.cc @ dec6c8

spielwiese
Last change on this file since dec6c8 was dec6c8, checked in by Hans Schoenemann <hannes@…>, 12 years ago
removed: kernel/page.*
  • 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/kstd1.h>
344#include <kernel/timer.h>
345
346
347#include "subexpr.h"
348#include "cntrlc.h"
349#include "ipid.h"
350#include "ipshell.h"
351
352#include "version.h"
353#include "static.h"
354
355#include "fehelp.h"
356
357#ifdef HAVE_STATIC
358#undef HAVE_DYN_RL
359#endif
360
361#define SI_DONT_HAVE_GLOBAL_VARS
362
363//#ifdef HAVE_LIBPARSER
364//#  include "libparse.h"
365//#endif /* HAVE_LIBPARSER */
366
367
368/*2
369* the renice routine for very large jobs
370* works only on unix machines,
371* testet on : linux, HP 9.0
372*
373*#include <sys/times.h>
374*#include <sys/resource.h>
375*extern "C" int setpriority(int,int,int);
376*void very_nice()
377*{
378*#ifndef NO_SETPRIORITY
379*  setpriority(PRIO_PROCESS,0,19);
380*#endif
381*  sleep(10);
382*}
383*/
384
385#include <string.h>
386#include <unistd.h>
387#include <stdio.h>
388#include <stddef.h>
389#include <stdlib.h>
390#include <time.h>
391
392
393void singular_example(char *str)
394{
395  assume(str!=NULL);
396  char *s=str;
397  while (*s==' ') s++;
398  char *ss=s;
399  while (*ss!='\0') ss++;
400  while (*ss<=' ')
401  {
402    *ss='\0';
403    ss--;
404  }
405  idhdl h=IDROOT->get(s,myynest);
406  if ((h!=NULL) && (IDTYP(h)==PROC_CMD))
407  {
408    char *lib=iiGetLibName(IDPROC(h));
409    if((lib!=NULL)&&(*lib!='\0'))
410    {
411      Print("// proc %s from lib %s\n",s,lib);
412      s=iiGetLibProcBuffer(IDPROC(h), 2);
413      if (s!=NULL)
414      {
415        if (strlen(s)>5)
416        {
417          iiEStart(s,IDPROC(h));
418          omFree((ADDRESS)s);
419          return;
420        }
421        else omFree((ADDRESS)s);
422      }
423    }
424  }
425  else
426  {
427    char sing_file[MAXPATHLEN];
428    FILE *fd=NULL;
429    char *res_m=feResource('m', 0);
430    if (res_m!=NULL)
431    {
432      sprintf(sing_file, "%s/%s.sing", res_m, s);
433      fd = feFopen(sing_file, "r");
434    }
435    if (fd != NULL)
436    {
437
438      int old_echo = si_echo;
439      int length, got;
440      char* s;
441
442      fseek(fd, 0, SEEK_END);
443      length = ftell(fd);
444      fseek(fd, 0, SEEK_SET);
445      s = (char*) omAlloc((length+20)*sizeof(char));
446      got = fread(s, sizeof(char), length, fd);
447      fclose(fd);
448      if (got != length)
449      {
450        Werror("Error while reading file %s", sing_file);
451      }
452      else
453      {
454        s[length] = '\0';
455        strcat(s, "\n;return();\n\n");
456        si_echo = 2;
457        iiEStart(s, NULL);
458        si_echo = old_echo;
459      }
460      omFree(s);
461    }
462    else
463    {
464      Werror("no example for %s", str);
465    }
466  }
467}
468
469
470struct soptionStruct
471{
472  const char * name;
473  unsigned   setval;
474  unsigned   resetval;
475};
476
477struct soptionStruct optionStruct[]=
478{
479  {"prot",         Sy_bit(OPT_PROT),           ~Sy_bit(OPT_PROT)   },
480  {"redSB",        Sy_bit(OPT_REDSB),          ~Sy_bit(OPT_REDSB)   },
481  {"notBuckets",   Sy_bit(OPT_NOT_BUCKETS),    ~Sy_bit(OPT_NOT_BUCKETS)   },
482  {"notSugar",     Sy_bit(OPT_NOT_SUGAR),      ~Sy_bit(OPT_NOT_SUGAR)   },
483  {"interrupt",    Sy_bit(OPT_INTERRUPT),      ~Sy_bit(OPT_INTERRUPT)   },
484  {"sugarCrit",    Sy_bit(OPT_SUGARCRIT),      ~Sy_bit(OPT_SUGARCRIT)   },
485  {"teach",        Sy_bit(OPT_DEBUG),          ~Sy_bit(OPT_DEBUG)  },
486  {"notSyzMinim",  Sy_bit(OPT_NO_SYZ_MINIM),   ~Sy_bit(OPT_NO_SYZ_MINIM)  },
487  /* 9 return SB in syz, quotient, intersect */
488  {"returnSB",     Sy_bit(OPT_RETURN_SB),      ~Sy_bit(OPT_RETURN_SB)  },
489  {"fastHC",       Sy_bit(OPT_FASTHC),         ~Sy_bit(OPT_FASTHC)  },
490  /* 11-19 sort in L/T */
491  {"staircaseBound",Sy_bit(OPT_STAIRCASEBOUND),~Sy_bit(OPT_STAIRCASEBOUND)  },
492  {"multBound",    Sy_bit(OPT_MULTBOUND),      ~Sy_bit(OPT_MULTBOUND)  },
493  {"degBound",     Sy_bit(OPT_DEGBOUND),       ~Sy_bit(OPT_DEGBOUND)  },
494  /* 25 no redTail(p)/redTail(s) */
495  {"redTail",      Sy_bit(OPT_REDTAIL),        ~Sy_bit(OPT_REDTAIL)  },
496  {"redThrough",   Sy_bit(OPT_REDTHROUGH),     ~Sy_bit(OPT_REDTHROUGH)  },
497  {"lazy",         Sy_bit(OPT_OLDSTD),         ~Sy_bit(OPT_OLDSTD)  },
498  {"intStrategy",  Sy_bit(OPT_INTSTRATEGY),    ~Sy_bit(OPT_INTSTRATEGY)  },
499  {"infRedTail",   Sy_bit(OPT_INFREDTAIL),     ~Sy_bit(OPT_INFREDTAIL)  },
500  /* 30: use not regularity for syz */
501  {"notRegularity",Sy_bit(OPT_NOTREGULARITY),  ~Sy_bit(OPT_NOTREGULARITY)  },
502  {"weightM",      Sy_bit(OPT_WEIGHTM),        ~Sy_bit(OPT_WEIGHTM)  },
503/*special for "none" and also end marker for showOption:*/
504  {"ne",           0,                          0 }
505};
506
507struct soptionStruct verboseStruct[]=
508{
509  {"mem",      Sy_bit(V_SHOW_MEM),  ~Sy_bit(V_SHOW_MEM)   },
510  {"yacc",     Sy_bit(V_YACC),      ~Sy_bit(V_YACC)       },
511  {"redefine", Sy_bit(V_REDEFINE),  ~Sy_bit(V_REDEFINE)   },
512  {"reading",  Sy_bit(V_READING),   ~Sy_bit(V_READING)    },
513  {"loadLib",  Sy_bit(V_LOAD_LIB),  ~Sy_bit(V_LOAD_LIB)   },
514  {"debugLib", Sy_bit(V_DEBUG_LIB), ~Sy_bit(V_DEBUG_LIB)  },
515  {"loadProc", Sy_bit(V_LOAD_PROC), ~Sy_bit(V_LOAD_PROC)  },
516  {"defRes",   Sy_bit(V_DEF_RES),   ~Sy_bit(V_DEF_RES)    },
517  {"usage",    Sy_bit(V_SHOW_USE),  ~Sy_bit(V_SHOW_USE)   },
518  {"Imap",     Sy_bit(V_IMAP),      ~Sy_bit(V_IMAP)       },
519  {"prompt",   Sy_bit(V_PROMPT),    ~Sy_bit(V_PROMPT)     },
520  {"length",   Sy_bit(V_LENGTH),    ~Sy_bit(V_LENGTH)     },
521  {"notWarnSB",Sy_bit(V_NSB),       ~Sy_bit(V_NSB)        },
522  {"contentSB",Sy_bit(V_CONTENTSB), ~Sy_bit(V_CONTENTSB)  },
523  {"cancelunit",Sy_bit(V_CANCELUNIT),~Sy_bit(V_CANCELUNIT)},
524  {"modpsolve",Sy_bit(V_MODPSOLVSB),~Sy_bit(V_MODPSOLVSB)},
525  {"geometricSB",Sy_bit(V_UPTORADICAL),~Sy_bit(V_UPTORADICAL)},
526  {"findMonomials",Sy_bit(V_FINDMONOM),~Sy_bit(V_FINDMONOM)},
527  {"coefStrat",Sy_bit(V_COEFSTRAT), ~Sy_bit(V_COEFSTRAT)},
528  {"qringNF",  Sy_bit(V_QRING),     ~Sy_bit(V_QRING)},
529  {"warn",     Sy_bit(V_ALLWARN),   ~Sy_bit(V_ALLWARN)},
530  {"interedSyz",Sy_bit(V_INTERSECT_SYZ), ~Sy_bit(V_INTERSECT_SYZ)},
531  {"interedElim",Sy_bit(V_INTERSECT_ELIM), ~Sy_bit(V_INTERSECT_ELIM)},
532/*special for "none" and also end marker for showOption:*/
533  {"ne",         0,          0 }
534};
535
536BOOLEAN setOption(leftv res, leftv v)
537{
538  const char *n;
539  do
540  {
541    if (v->Typ()==STRING_CMD)
542    {
543      n=(const char *)v->CopyD(STRING_CMD);
544    }
545    else
546    {
547      if (v->name==NULL)
548        return TRUE;
549      if (v->rtyp==0)
550      {
551        n=v->name;
552        v->name=NULL;
553      }
554      else
555      {
556        n=omStrDup(v->name);
557      }
558    }
559
560    int i;
561
562    if(strcmp(n,"get")==0)
563    {
564      intvec *w=new intvec(2);
565      (*w)[0]=test;
566      (*w)[1]=verbose;
567      res->rtyp=INTVEC_CMD;
568      res->data=(void *)w;
569      goto okay;
570    }
571    if(strcmp(n,"set")==0)
572    {
573      if((v->next!=NULL)
574      &&(v->next->Typ()==INTVEC_CMD))
575      {
576        v=v->next;
577        intvec *w=(intvec*)v->Data();
578        test=(*w)[0];
579        verbose=(*w)[1];
580#if 0
581        if (TEST_OPT_INTSTRATEGY && (currRing!=NULL)
582        && rField_has_simple_inverse()
583#ifdef HAVE_RINGS
584        && !rField_is_Ring(currRing)
585#endif
586        ) {
587          test &=~Sy_bit(OPT_INTSTRATEGY);
588        }
589#endif
590        goto okay;
591      }
592    }
593    if(strcmp(n,"none")==0)
594    {
595      test=0;
596      verbose=0;
597      goto okay;
598    }
599    for (i=0; (i==0) || (optionStruct[i-1].setval!=0); i++)
600    {
601      if (strcmp(n,optionStruct[i].name)==0)
602      {
603        if (optionStruct[i].setval & validOpts)
604        {
605          test |= optionStruct[i].setval;
606          // optOldStd disables redthrough
607          if (optionStruct[i].setval == Sy_bit(OPT_OLDSTD))
608            test &= ~Sy_bit(OPT_REDTHROUGH);
609        }
610        else
611          Warn("cannot set option");
612#if 0
613        if (TEST_OPT_INTSTRATEGY && (currRing!=NULL)
614        && rField_has_simple_inverse()
615#ifdef HAVE_RINGS
616        && !rField_is_Ring(currRing)
617#endif
618        ) {
619          test &=~Sy_bit(OPT_INTSTRATEGY);
620        }
621#endif
622        goto okay;
623      }
624      else if ((strncmp(n,"no",2)==0)
625      && (strcmp(n+2,optionStruct[i].name)==0))
626      {
627        if (optionStruct[i].setval & validOpts)
628        {
629          test &= optionStruct[i].resetval;
630        }
631        else
632          Warn("cannot clear option");
633        goto okay;
634      }
635    }
636    for (i=0; (i==0) || (verboseStruct[i-1].setval!=0); i++)
637    {
638      if (strcmp(n,verboseStruct[i].name)==0)
639      {
640        verbose |= verboseStruct[i].setval;
641        #ifdef YYDEBUG
642        #if YYDEBUG
643        /*debugging the bison grammar --> grammar.cc*/
644        extern int    yydebug;
645        if (BVERBOSE(V_YACC)) yydebug=1;
646        else                  yydebug=0;
647        #endif
648        #endif
649        goto okay;
650      }
651      else if ((strncmp(n,"no",2)==0)
652      && (strcmp(n+2,verboseStruct[i].name)==0))
653      {
654        verbose &= verboseStruct[i].resetval;
655        #ifdef YYDEBUG
656        #if YYDEBUG
657        /*debugging the bison grammar --> grammar.cc*/
658        extern int    yydebug;
659        if (BVERBOSE(V_YACC)) yydebug=1;
660        else                  yydebug=0;
661        #endif
662        #endif
663        goto okay;
664      }
665    }
666    Werror("unknown option `%s`",n);
667  okay:
668    if (currRing != NULL)
669      currRing->options = test & TEST_RINGDEP_OPTS;
670    omFree((ADDRESS)n);
671    v=v->next;
672  } while (v!=NULL);
673
674#ifdef OM_SINGULAR_CONFIG_H
675   // set global variable to show memory usage
676  extern int om_sing_opt_show_mem;
677  if (BVERBOSE(V_SHOW_MEM)) om_sing_opt_show_mem = 1;
678  else om_sing_opt_show_mem = 0;
679#endif
680
681  return FALSE;
682}
683
684char * showOption()
685{
686  int i;
687  BITSET tmp;
688
689  StringSetS("//options:");
690  if ((test!=0)||(verbose!=0))
691  {
692    tmp=test;
693    if(tmp)
694    {
695      for (i=0; optionStruct[i].setval!=0; i++)
696      {
697        if (optionStruct[i].setval & test)
698        {
699          StringAppend(" %s",optionStruct[i].name);
700          tmp &=optionStruct[i].resetval;
701        }
702      }
703      for (i=0; i<32; i++)
704      {
705        if (tmp & Sy_bit(i)) StringAppend(" %d",i);
706      }
707    }
708    tmp=verbose;
709    if (tmp)
710    {
711      for (i=0; verboseStruct[i].setval!=0; i++)
712      {
713        if (verboseStruct[i].setval & tmp)
714        {
715          StringAppend(" %s",verboseStruct[i].name);
716          tmp &=verboseStruct[i].resetval;
717        }
718      }
719      for (i=1; i<32; i++)
720      {
721        if (tmp & Sy_bit(i)) StringAppend(" %d",i+32);
722      }
723    }
724    return omStrDup(StringAppendS(""));
725  }
726  else
727    return omStrDup(StringAppendS(" none"));
728}
729
730char * versionString()
731{
732  char* str = StringSetS("");
733  StringAppend("Singular for %s version %s (%d-%s)  %s\nwith\n",
734               S_UNAME, S_VERSION1, SINGULAR_VERSION,
735               feVersionId,singular_date);
736  StringAppendS("\t");
737#ifdef HAVE_FACTORY
738  StringAppend("factory(%s)", factoryVersion);
739#ifdef HAVE_LIBFAC
740  // libfac:
741//  extern const char * libfac_version;
742//  extern const char * libfac_date;
743  StringAppend("+libfac");
744#endif // #ifdef HAVE_LIBFAC
745  StringAppend(",");
746#endif
747
748#if defined (__GNU_MP_VERSION) && defined (__GNU_MP_VERSION_MINOR)
749              StringAppend("GMP(%d.%d),",__GNU_MP_VERSION,__GNU_MP_VERSION_MINOR);
750#else
751              StringAppendS("GMP(1.3),");
752#endif
753#ifdef HAVE_NTL
754#include <NTL/version.h>
755              StringAppend("NTL(%s),",NTL_VERSION);
756#endif
757#if SIZEOF_VOIDP == 8
758              StringAppendS("64bit,");
759#else
760              StringAppendS("32bit,");
761#endif
762#if defined(HAVE_DYN_RL)
763              if (fe_fgets_stdin==fe_fgets_dummy)
764                StringAppendS("no input,");
765              else if (fe_fgets_stdin==fe_fgets)
766                StringAppendS("fgets,");
767              if (fe_fgets_stdin==fe_fgets_stdin_drl)
768                StringAppendS("dynamic readline,");
769              #ifdef HAVE_FEREAD
770              else if (fe_fgets_stdin==fe_fgets_stdin_emu)
771                StringAppendS("emulated readline,");
772              #endif
773              else
774                StringAppendS("unknown fgets method,");
775#else
776  #if defined(HAVE_READLINE) && !defined(FEREAD)
777              StringAppendS("static readline,");
778  #else
779    #ifdef HAVE_FEREAD
780              StringAppendS("emulated readline,");
781    #else
782              StringAppendS("fgets,");
783    #endif
784  #endif
785#endif
786#ifdef HAVE_PLURAL
787              StringAppendS("Plural,");
788#endif
789#ifdef HAVE_DBM
790              StringAppendS("DBM,\n\t");
791#else
792              StringAppendS("\n\t");
793#endif
794#ifdef HAVE_DYNAMIC_LOADING
795              StringAppendS("dynamic modules,");
796#endif
797              if (p_procs_dynamic) StringAppendS("dynamic p_Procs,");
798#ifdef TEST
799              StringAppendS("TESTs,");
800#endif
801#if YYDEBUG
802              StringAppendS("YYDEBUG=1,");
803#endif
804#ifdef HAVE_ASSUME
805             StringAppendS("ASSUME,");
806#endif
807#ifdef MDEBUG
808              StringAppend("MDEBUG=%d,",MDEBUG);
809#endif
810#ifdef OM_CHECK
811              StringAppend("OM_CHECK=%d,",OM_CHECK);
812#endif
813#ifdef OM_TRACK
814              StringAppend("OM_TRACK=%d,",OM_TRACK);
815#endif
816#ifdef OM_NDEBUG
817              StringAppendS("OM_NDEBUG,");
818#endif
819#ifdef PDEBUG
820              StringAppendS("PDEBUG,");
821#endif
822#ifdef KDEBUG
823              StringAppendS("KDEBUG,");
824#endif
825#ifndef __OPTIMIZE__
826              StringAppendS("-g,");
827#endif
828#ifdef HAVE_EIGENVAL
829              StringAppendS("eigenvalues,");
830#endif
831#ifdef HAVE_GMS
832              StringAppendS("Gauss-Manin system,");
833#endif
834#ifdef HAVE_RATGRING
835              StringAppendS("ratGB,");
836#endif
837              StringAppend("random=%d\n",siRandomStart);
838              StringAppend("\tCC=%s,\n\tCXX=%s"
839#ifdef __GNUC__
840              "(" __VERSION__ ")"
841#endif
842              "\n",CC,CXX);
843              feStringAppendResources(0);
844              feStringAppendBrowsers(0);
845              StringAppendS("\n");
846              return str;
847}
848
849#ifdef PDEBUG
850#if (OM_TRACK > 2) && defined(OM_TRACK_CUSTOM)
851void p_SetRingOfLeftv(leftv l, ring r)
852{
853  switch(l->rtyp)
854  {
855    case INT_CMD:
856    case BIGINT_CMD:
857    case IDHDL:
858    case DEF_CMD:
859      break;
860    case POLY_CMD:
861    case VECTOR_CMD:
862    {
863      poly p=(poly)l->data;
864      while(p!=NULL) { p_SetRingOfLm(p,r); pIter(p); }
865      break;
866    }
867    case IDEAL_CMD:
868    case MODUL_CMD:
869    case MATRIX_CMD:
870    {
871      ideal I=(ideal)l->data;
872      int i;
873      for(i=IDELEMS(I)-1;i>=0;i--)
874      {
875        poly p=I->m[i];
876        while(p!=NULL) { p_SetRingOfLm(p,r); pIter(p); }
877      }
878      break;
879    }
880    case COMMAND:
881    {
882      command d=(command)l->data;
883      p_SetRingOfLeftv(&d->arg1, r);
884      if (d->argc>1) p_SetRingOfLeftv(&d->arg2, r);
885      if (d->argc>2) p_SetRingOfLeftv(&d->arg3, r);
886      break;
887    }
888    default:
889     printf("type %d not yet implementd in p_SetRingOfLeftv\n",l->rtyp);
890     break;
891  }
892}
893#endif
894#endif
895
896#if 0 /* debug only */
897void listall(int showproc)
898{
899      idhdl hh=basePack->idroot;
900      PrintS("====== Top ==============\n");
901      while (hh!=NULL)
902      {
903        if (showproc || (IDTYP(hh)!=PROC_CMD))
904        {
905          if (IDDATA(hh)==(void *)currRing) PrintS("(R)");
906          else if (IDDATA(hh)==(void *)currPack) PrintS("(P)");
907          else PrintS("   ");
908          Print("::%s, typ %s level %d data %lx",
909                 IDID(hh),Tok2Cmdname(IDTYP(hh)),IDLEV(hh),(long)IDDATA(hh));
910          if ((IDTYP(hh)==RING_CMD)
911          || (IDTYP(hh)==QRING_CMD))
912            Print(" ref: %d\n",IDRING(hh)->ref);
913          else
914            PrintLn();
915        }
916        hh=IDNEXT(hh);
917      }
918      hh=basePack->idroot;
919      while (hh!=NULL)
920      {
921        if (IDDATA(hh)==(void *)basePack)
922          Print("(T)::%s, typ %s level %d data %lx\n",
923          IDID(hh),Tok2Cmdname(IDTYP(hh)),IDLEV(hh),(long)IDDATA(hh));
924        else
925        if ((IDTYP(hh)==RING_CMD)
926        || (IDTYP(hh)==QRING_CMD)
927        || (IDTYP(hh)==PACKAGE_CMD))
928        {
929          Print("====== %s ==============\n",IDID(hh));
930          idhdl h2=IDRING(hh)->idroot;
931          while (h2!=NULL)
932          {
933            if (showproc || (IDTYP(h2)!=PROC_CMD))
934            {
935              if ((IDDATA(h2)==(void *)currRing)
936              && ((IDTYP(h2)==RING_CMD)||(IDTYP(h2)==QRING_CMD)))
937                PrintS("(R)");
938              else if (IDDATA(h2)==(void *)currPack) PrintS("(P)");
939              else PrintS("   ");
940              Print("%s::%s, typ %s level %d data %lx\n",
941              IDID(hh),IDID(h2),Tok2Cmdname(IDTYP(h2)),IDLEV(h2),(long)IDDATA(h2));
942            }
943            h2=IDNEXT(h2);
944          }
945        }
946        hh=IDNEXT(hh);
947      }
948      Print("currRing:%lx, currPack:%lx,basePack:%lx\n",(long)currRing,(long)currPack,(long)basePack);
949      iiCheckPack(currPack);
950}
951#endif
952
953#ifndef NDEBUG
954void checkall()
955{
956      idhdl hh=basePack->idroot;
957      while (hh!=NULL)
958      {
959        omCheckAddr(hh);
960        omCheckAddr((ADDRESS)IDID(hh));
961        if (RingDependend(IDTYP(hh))) Print("%s typ %d in Top\n",IDID(hh),IDTYP(hh));
962        hh=IDNEXT(hh);
963      }
964      hh=basePack->idroot;
965      while (hh!=NULL)
966      {
967        if (IDTYP(hh)==PACKAGE_CMD)
968        {
969          idhdl h2=IDPACKAGE(hh)->idroot;
970          while (h2!=NULL)
971          {
972            omCheckAddr(h2);
973            omCheckAddr((ADDRESS)IDID(h2));
974            if (RingDependend(IDTYP(h2))) Print("%s typ %d in %s\n",IDID(h2),IDTYP(h2),IDID(hh));
975            h2=IDNEXT(h2);
976          }
977        }
978        hh=IDNEXT(hh);
979      }
980}
981#endif
982
983#include <sys/types.h>
984#include <sys/stat.h>
985#include <unistd.h>
986
987extern "C"
988int singular_fstat(int fd, struct stat *buf)
989{
990  return fstat(fd,buf);
991}
992
993/*2
994* the global exit routine of Singular
995*/
996extern "C" {
997
998void m2_end(int i)
999{
1000  fe_reset_input_mode();
1001  #ifdef PAGE_TEST
1002  mmEndStat();
1003  #endif
1004  fe_reset_input_mode();
1005  idhdl h = IDROOT;
1006  while(h != NULL)
1007  {
1008    if(IDTYP(h) == LINK_CMD)
1009    {
1010      idhdl hh=h->next;
1011      killhdl(h, currPack);
1012      h = hh;
1013    }
1014    else
1015    {
1016      h = h->next;
1017    }
1018  }
1019  if(!singular_in_batchmode)
1020  {
1021    if (i<=0)
1022    {
1023      if (TEST_V_QUIET)
1024      {
1025        if (i==0)
1026          printf("Auf Wiedersehen.\n");
1027        else
1028          printf("\n$Bye.\n");
1029      }
1030      //#ifdef sun
1031      //  #ifndef __svr4__
1032      //    _cleanup();
1033      //    _exit(0);
1034      //  #endif
1035      //#endif
1036      i=0;
1037    }
1038    else
1039    {
1040        printf("\nhalt %d\n",i);
1041    }
1042  }
1043  exit(i);
1044}
1045}
1046
1047const char *singular_date=__DATE__ " " __TIME__;
1048
1049extern "C"
1050{
1051  void omSingOutOfMemoryFunc()
1052  {
1053    fprintf(stderr, "\nSingular error: no more memory\n");
1054    omPrintStats(stderr);
1055    m2_end(14);
1056    /* should never get here */
1057    exit(1);
1058  }
1059}
1060
1061/*2
1062* initialize components of Singular
1063*/
1064void siInit(char *name)
1065{
1066#ifdef HAVE_FACTORY
1067// factory default settings: -----------------------------------------------
1068  On(SW_USE_NTL);
1069  On(SW_USE_NTL_GCD_0); // On -> seg11 in Old/algnorm, Old/factor...
1070  On(SW_USE_NTL_GCD_P); // On -> cyle in Short/brnoeth_s: fixed
1071  On(SW_USE_EZGCD);
1072  On(SW_USE_CHINREM_GCD);
1073  //On(SW_USE_FF_MOD_GCD);
1074  On(SW_USE_EZGCD_P);
1075  On(SW_USE_QGCD);
1076  Off(SW_USE_NTL_SORT); // may be changed by an command line option
1077  factoryError=WerrorS;
1078#endif
1079
1080// memory initialization: -----------------------------------------------
1081    om_Opts.OutOfMemoryFunc = omSingOutOfMemoryFunc;
1082#ifndef OM_NDEBUG
1083#ifndef __OPTIMIZE__
1084    om_Opts.ErrorHook = dErrorBreak;
1085#endif
1086#endif
1087    omInitInfo();
1088#ifdef OM_SING_KEEP
1089    om_Opts.Keep = OM_SING_KEEP;
1090#endif
1091
1092// interpreter tables etc.: -----------------------------------------------
1093#ifdef INIT_BUG
1094  jjInitTab1();
1095#endif
1096  memset(&sLastPrinted,0,sizeof(sleftv));
1097  sLastPrinted.rtyp=NONE;
1098
1099  extern int iiInitArithmetic(); iiInitArithmetic(); // iparith.cc
1100
1101  basePack=(package)omAlloc0(sizeof(*basePack));
1102  currPack=basePack;
1103  idhdl h;
1104  h=enterid("Top", 0, PACKAGE_CMD, &IDROOT, TRUE);
1105  IDPACKAGE(h)->language = LANG_TOP;
1106  IDPACKAGE(h)=basePack;
1107  currPackHdl=h;
1108  basePackHdl=h;
1109
1110  coeffs_BIGINT = nInitChar(n_Q,NULL);
1111
1112#if 1
1113   // def HAVE_POLYEXTENSIONS
1114  if(TRUE)
1115  {
1116    n_coeffType type = nRegister(n_algExt, naInitChar);
1117    assume(type == n_algExt);
1118
1119    type = nRegister(n_transExt, ntInitChar);
1120    assume(type == n_transExt);
1121  }
1122#endif
1123
1124// random generator: -----------------------------------------------
1125  int t=initTimer();
1126  if (t==0) t=1;
1127  initRTimer();
1128  siSeed=t;
1129#ifdef HAVE_FACTORY
1130  factoryseed(t);
1131#endif
1132  siRandomStart=t;
1133  feOptSpec[FE_OPT_RANDOM].value = (void*) ((long)siRandomStart);
1134
1135// ressource table: ----------------------------------------------------
1136  // Don't worry: ifdef OM_NDEBUG, then all these calls are undef'ed
1137  // hack such that all shared' libs in the bindir are loaded correctly
1138  feInitResources(name);
1139
1140// singular links: --------------------------------------------------
1141  slStandardInit();
1142  myynest=0;
1143
1144// loading standard.lib -----------------------------------------------
1145  if (! feOptValue(FE_OPT_NO_STDLIB))
1146  {
1147    int vv=verbose;
1148    verbose &= ~Sy_bit(V_LOAD_LIB);
1149    iiLibCmd(omStrDup("standard.lib"), TRUE,TRUE,TRUE);
1150    verbose=vv;
1151  }
1152  errorreported = 0;
1153}
1154
1155/*
1156#ifdef LIBSINGULAR
1157#ifdef HAVE_FACTORY
1158// the init routines of factory need mmInit
1159int mmInit( void )
1160{
1161  return 1;
1162}
1163#endif
1164#endif
1165*/
Note: See TracBrowser for help on using the repository browser.