source: git/Singular/misc_ip.cc @ 789b8c

spielwiese
Last change on this file since 789b8c was 789b8c, checked in by Hans Schoenemann <hannes@…>, 6 years ago
add: report use of omalloc/xalloc with -v
  • Property mode set to 100644
File size: 36.1 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#define PLURAL_INTERNAL_DECLARATIONS 1
15
16#include "kernel/mod2.h"
17#include "misc/sirandom.h"
18
19#include "omalloc/omalloc.h"
20#include "misc/mylimits.h"
21
22#include "reporter/si_signals.h"
23
24#include "factory/factory.h"
25
26#include "coeffs/si_gmp.h"
27#include "coeffs/coeffs.h"
28#include "coeffs/OPAE.h"
29#include "coeffs/OPAEQ.h"
30#include "coeffs/OPAEp.h"
31#include "coeffs/flintcf_Q.h"
32#include "coeffs/flintcf_Zn.h"
33
34#include "polys/ext_fields/algext.h"
35#include "polys/ext_fields/transext.h"
36#include "polys/nc/gb_hack.h"
37
38#ifdef HAVE_SIMPLEIPC
39#include "Singular/links/simpleipc.h"
40#endif
41
42#include "misc_ip.h"
43#include "ipid.h"
44#include "feOpt.h"
45#include "links/silink.h"
46#include "mod_lib.h"
47#include "Singular/distrib.h"
48
49#include "misc/options.h"
50#include "misc/intvec.h"
51
52#include "polys/monomials/ring.h"
53#include "polys/templates/p_Procs.h"
54
55#include "kernel/GBEngine/kstd1.h"
56#include "kernel/oswrapper/timer.h"
57#include "resources/feResource.h"
58#include "kernel/oswrapper/feread.h"
59
60#include "subexpr.h"
61#include "cntrlc.h"
62#include "ipshell.h"
63
64#include "fehelp.h"
65
66#ifdef HAVE_READLINE
67  #ifdef READLINE_READLINE_H_OK
68    #include <readline/readline.h>
69  #endif
70  #ifndef RL_VERSION_MAJOR
71    #define RL_VERSION_MAJOR 0
72  #endif
73#endif
74
75#ifdef HAVE_NTL
76#include<NTL/version.h>
77#include<NTL/tools.h>
78#ifdef NTL_CLIENT
79NTL_CLIENT
80#endif
81#endif
82
83
84static FORCE_INLINE void number2mpz(number n, mpz_t m){ number2mpz(n, coeffs_BIGINT, m); }
85static FORCE_INLINE number mpz2number(mpz_t m){ return mpz2number(m, coeffs_BIGINT); }
86
87
88void setListEntry(lists L, int index, mpz_t n)
89{ /* assumes n > 0 */
90  /* try to fit nn into an int: */
91  if (mpz_size1(n)<=1)
92  {
93    int ui=(int)mpz_get_si(n);
94    if ((((ui<<3)>>3)==ui)
95    && (mpz_cmp_si(n,(long)ui)==0))
96    {
97      L->m[index].rtyp = INT_CMD; L->m[index].data = (void*)(long)ui;
98      return;
99    }
100  }
101  number nn = mpz2number(n);
102  L->m[index].rtyp = BIGINT_CMD; L->m[index].data = (void*)nn;
103}
104
105void setListEntry_ui(lists L, int index, unsigned long ui)
106{ /* assumes n > 0 */
107  /* try to fit nn into an int: */
108  int i=(int)ui;
109  if ((((unsigned long)i)==ui) && (((i<<3)>>3)==i))
110  {
111    L->m[index].rtyp = INT_CMD; L->m[index].data = (void*)(long)i;
112  }
113  else
114  {
115    number nn = n_Init(ui, coeffs_BIGINT);
116    L->m[index].rtyp = BIGINT_CMD; L->m[index].data = (void*)nn;
117  }
118}
119
120/* Factoring with Pollard's rho method. stolen from GMP/demos */
121static unsigned add[] = {4, 2, 4, 2, 4, 6, 2, 6};
122
123static int factor_using_division (mpz_t t, unsigned int limit,lists primes, int *multiplicities,int &index, unsigned long bound)
124{
125  mpz_t q, r;
126  unsigned long int f;
127  int ai;
128  unsigned *addv = add;
129  unsigned int failures;
130  int bound_not_reached=1;
131
132  mpz_init (q);
133  mpz_init (r);
134
135  f = mpz_scan1 (t, 0);
136  mpz_div_2exp (t, t, f);
137  if (f>0)
138  {
139    setListEntry_ui(primes, index, 2);
140    multiplicities[index++] = f;
141  }
142
143  f=0;
144  loop
145  {
146    mpz_tdiv_qr_ui (q, r, t, 3);
147    if (mpz_sgn1 (r) != 0)
148        break;
149    mpz_set (t, q);
150    f++;
151  }
152  if (f>0)
153  {
154    setListEntry_ui(primes, index, 3);
155    multiplicities[index++] = f;
156  }
157  f=0;
158  loop
159  {
160    mpz_tdiv_qr_ui (q, r, t, 5);
161    if (mpz_sgn1 (r) != 0)
162        break;
163    mpz_set (t, q);
164    f++;
165  }
166  if (f>0)
167  {
168    setListEntry_ui(primes, index, 5);
169    multiplicities[index++] = f;
170  }
171
172  failures = 0;
173  f = 7;
174  ai = 0;
175  unsigned long last_f=0;
176  while (mpz_cmp_ui (t, 1) != 0)
177  {
178    mpz_tdiv_qr_ui (q, r, t, f);
179    if (mpz_sgn1 (r) != 0)
180    {
181      f += addv[ai];
182      if (mpz_cmp_ui (t, f) < 0)
183        break;
184      ai = (ai + 1) & 7;
185      failures++;
186      if (failures > limit)
187        break;
188      if ((bound!=0) && (f>bound))
189      {
190        bound_not_reached=0;
191        break;
192      }
193    }
194    else
195    {
196      mpz_swap (t, q);
197      if (f!=last_f)
198      {
199        setListEntry_ui(primes, index, f);
200        multiplicities[index]++;
201        index++;
202      }
203      else
204      {
205        multiplicities[index-1]++;
206      }
207      last_f=f;
208      failures = 0;
209    }
210  }
211
212  mpz_clear (q);
213  mpz_clear (r);
214  //printf("bound=%d,f=%d,failures=%d, reached=%d\n",bound,f,failures,bound_not_reached);
215  return bound_not_reached;
216}
217
218static void factor_using_pollard_rho (mpz_t n, unsigned long a, lists primes, int * multiplicities,int &index)
219{
220  mpz_t x, x1, y, P;
221  mpz_t t1, t2;
222  mpz_t last_f;
223  unsigned long long k, l, i;
224
225  mpz_init (t1);
226  mpz_init (t2);
227  mpz_init_set_ui (last_f, 0);
228  mpz_init_set_ui (y, 2);
229  mpz_init_set_ui (x, 2);
230  mpz_init_set_ui (x1, 2);
231  mpz_init_set_ui (P, 1);
232  k = 1;
233  l = 1;
234
235  while (mpz_cmp_ui (n, 1) != 0)
236  {
237    loop
238    {
239      do
240      {
241        mpz_mul (t1, x, x);
242        mpz_mod (x, t1, n);
243        mpz_add_ui (x, x, a);
244        mpz_sub (t1, x1, x);
245        mpz_mul (t2, P, t1);
246        mpz_mod (P, t2, n);
247
248        if (k % 32 == 1)
249        {
250          mpz_gcd (t1, P, n);
251          if (mpz_cmp_ui (t1, 1) != 0)
252            goto factor_found;
253          mpz_set (y, x);
254        }
255      }
256      while (--k != 0);
257
258      mpz_gcd (t1, P, n);
259      if (mpz_cmp_ui (t1, 1) != 0)
260        goto factor_found;
261
262      mpz_set (x1, x);
263      k = l;
264      l = 2 * l;
265      for (i = 0; i < k; i++)
266      {
267        mpz_mul (t1, x, x);
268        mpz_mod (x, t1, n);
269        mpz_add_ui (x, x, a);
270      }
271      mpz_set (y, x);
272    }
273
274  factor_found:
275    do
276    {
277      mpz_mul (t1, y, y);
278      mpz_mod (y, t1, n);
279      mpz_add_ui (y, y, a);
280      mpz_sub (t1, x1, y);
281      mpz_gcd (t1, t1, n);
282    }
283    while (mpz_cmp_ui (t1, 1) == 0);
284
285    mpz_divexact (n, n, t1);        /* divide by t1, before t1 is overwritten */
286
287    if (!mpz_probab_prime_p (t1, 10))
288    {
289      do
290      {
291        mp_limb_t a_limb;
292        mpn_random (&a_limb, (mp_size_t) 1);
293        a = a_limb;
294      }
295      while (a == 0);
296
297      factor_using_pollard_rho (t1, a, primes,multiplicities,index);
298    }
299    else
300    {
301      if (mpz_cmp(t1,last_f)==0)
302      {
303        multiplicities[index-1]++;
304      }
305      else
306      {
307        mpz_set(last_f,t1);
308        setListEntry(primes, index, t1);
309        multiplicities[index++] = 1;
310      }
311    }
312    mpz_mod (x, x, n);
313    mpz_mod (x1, x1, n);
314    mpz_mod (y, y, n);
315    if (mpz_probab_prime_p (n, 10))
316    {
317      if (mpz_cmp(n,last_f)==0)
318      {
319        multiplicities[index-1]++;
320      }
321      else
322      {
323        mpz_set(last_f,n);
324        setListEntry(primes, index, n);
325        multiplicities[index++] = 1;
326      }
327      mpz_set_ui(n,1);
328      break;
329    }
330  }
331
332  mpz_clear (P);
333  mpz_clear (t2);
334  mpz_clear (t1);
335  mpz_clear (x1);
336  mpz_clear (x);
337  mpz_clear (y);
338  mpz_clear (last_f);
339}
340
341static void factor_gmp (mpz_t t,lists primes,int *multiplicities,int &index,unsigned long bound)
342{
343  unsigned int division_limit;
344
345  if (mpz_sgn (t) == 0)
346    return;
347
348  /* Set the trial division limit according the size of t.  */
349  division_limit = mpz_sizeinbase (t, 2);
350  if (division_limit > 1000)
351    division_limit = 1000 * 1000;
352  else
353    division_limit = division_limit * division_limit;
354
355  if (factor_using_division (t, division_limit,primes,multiplicities,index,bound))
356  {
357    if (mpz_cmp_ui (t, 1) != 0)
358    {
359      if (mpz_probab_prime_p (t, 10))
360      {
361        setListEntry(primes, index, t);
362        multiplicities[index++] = 1;
363        mpz_set_ui(t,1);
364      }
365      else
366        factor_using_pollard_rho (t, 1L, primes,multiplicities,index);
367    }
368  }
369}
370/* n and pBound are assumed to be bigint numbers */
371lists primeFactorisation(const number n, const int pBound)
372{
373  int i;
374  int index=0;
375  mpz_t nn; number2mpz(n, nn);
376  lists primes = (lists)omAllocBin(slists_bin); primes->Init(1000);
377  int* multiplicities = (int*)omAlloc0(1000*sizeof(int));
378  int positive=1;
379
380  if (!n_IsZero(n, coeffs_BIGINT))
381  {
382    if (!n_GreaterZero(n, coeffs_BIGINT))
383    {
384      positive=-1;
385      mpz_neg(nn,nn);
386    }
387    factor_gmp(nn,primes,multiplicities,index,pBound);
388  }
389
390  lists primesL = (lists)omAllocBin(slists_bin);
391  primesL->Init(index);
392  for (i = 0; i < index; i++)
393  {
394    primesL->m[i].rtyp = primes->m[i].rtyp;
395    primesL->m[i].data = primes->m[i].data;
396    primes->m[i].rtyp=0;
397    primes->m[i].data=NULL;
398  }
399  primes->Clean(NULL);
400
401  lists multiplicitiesL = (lists)omAllocBin(slists_bin);
402  multiplicitiesL->Init(index);
403  for (i = 0; i < index; i++)
404  {
405    multiplicitiesL->m[i].rtyp = INT_CMD;
406    multiplicitiesL->m[i].data = (void*)(long)multiplicities[i];
407  }
408  omFree(multiplicities);
409
410  lists L=(lists)omAllocBin(slists_bin);
411  L->Init(3);
412  if (positive==-1) mpz_neg(nn,nn);
413  L->m[0].rtyp = LIST_CMD; L->m[0].data = (void*)primesL;
414  L->m[1].rtyp = LIST_CMD; L->m[1].data = (void*)multiplicitiesL;
415  setListEntry(L, 2, nn);
416
417  mpz_clear(nn);
418
419  return L;
420}
421
422#ifdef HAVE_STATIC
423#undef HAVE_DYN_RL
424#endif
425
426//#ifdef HAVE_LIBPARSER
427//#  include "libparse.h"
428//#endif /* HAVE_LIBPARSER */
429
430
431/*2
432* the renice routine for very large jobs
433* works only on unix machines,
434* testet on : linux, HP 9.0
435*
436*#include <sys/times.h>
437*#include <sys/resource.h>
438*extern "C" int setpriority(int,int,int);
439*void very_nice()
440*{
441*#ifndef NO_SETPRIORITY
442*  setpriority(PRIO_PROCESS,0,19);
443*#endif
444*  sleep(10);
445*}
446*/
447
448#include <string.h>
449#include <unistd.h>
450#include <stdio.h>
451#include <stddef.h>
452#include <stdlib.h>
453#include <time.h>
454
455
456void singular_example(char *str)
457{
458  assume(str!=NULL);
459  char *s=str;
460  while (*s==' ') s++;
461  char *ss=s;
462  while (*ss!='\0') ss++;
463  while (*ss<=' ')
464  {
465    *ss='\0';
466    ss--;
467  }
468  idhdl h=IDROOT->get(s,myynest);
469  if ((h!=NULL) && (IDTYP(h)==PROC_CMD))
470  {
471    char *lib=iiGetLibName(IDPROC(h));
472    if((lib!=NULL)&&(*lib!='\0'))
473    {
474      Print("// proc %s from lib %s\n",s,lib);
475      s=iiGetLibProcBuffer(IDPROC(h), 2);
476      if (s!=NULL)
477      {
478        if (strlen(s)>5)
479        {
480          iiEStart(s,IDPROC(h));
481          omFree((ADDRESS)s);
482          return;
483        }
484        else omFree((ADDRESS)s);
485      }
486    }
487  }
488  else
489  {
490    char sing_file[MAXPATHLEN];
491    FILE *fd=NULL;
492    char *res_m=feResource('m', 0);
493    if (res_m!=NULL)
494    {
495      sprintf(sing_file, "%s/%s.sing", res_m, s);
496      fd = feFopen(sing_file, "r");
497    }
498    if (fd != NULL)
499    {
500
501      int old_echo = si_echo;
502      int length, got;
503      char* s;
504
505      fseek(fd, 0, SEEK_END);
506      length = ftell(fd);
507      fseek(fd, 0, SEEK_SET);
508      s = (char*) omAlloc((length+20)*sizeof(char));
509      got = fread(s, sizeof(char), length, fd);
510      fclose(fd);
511      if (got != length)
512      {
513        Werror("Error while reading file %s", sing_file);
514      }
515      else
516      {
517        s[length] = '\0';
518        strcat(s, "\n;return();\n\n");
519        si_echo = 2;
520        iiEStart(s, NULL);
521        si_echo = old_echo;
522      }
523      omFree(s);
524    }
525    else
526    {
527      Werror("no example for %s", str);
528    }
529  }
530}
531
532
533const struct soptionStruct optionStruct[]=
534{
535  {"prot",         Sy_bit(OPT_PROT),           ~Sy_bit(OPT_PROT)   },
536  {"redSB",        Sy_bit(OPT_REDSB),          ~Sy_bit(OPT_REDSB)   },
537  {"notBuckets",   Sy_bit(OPT_NOT_BUCKETS),    ~Sy_bit(OPT_NOT_BUCKETS)   },
538  {"notSugar",     Sy_bit(OPT_NOT_SUGAR),      ~Sy_bit(OPT_NOT_SUGAR)   },
539  {"interrupt",    Sy_bit(OPT_INTERRUPT),      ~Sy_bit(OPT_INTERRUPT)   },
540  {"sugarCrit",    Sy_bit(OPT_SUGARCRIT),      ~Sy_bit(OPT_SUGARCRIT)   },
541  {"teach",        Sy_bit(OPT_DEBUG),          ~Sy_bit(OPT_DEBUG)  },
542  {"notSyzMinim",  Sy_bit(OPT_NO_SYZ_MINIM),   ~Sy_bit(OPT_NO_SYZ_MINIM)  },
543  /* 9 return SB in syz, quotient, intersect */
544  {"returnSB",     Sy_bit(OPT_RETURN_SB),      ~Sy_bit(OPT_RETURN_SB)  },
545  {"fastHC",       Sy_bit(OPT_FASTHC),         ~Sy_bit(OPT_FASTHC)  },
546  /* 11-19 sort in L/T */
547  {"staircaseBound",Sy_bit(OPT_STAIRCASEBOUND),~Sy_bit(OPT_STAIRCASEBOUND)  },
548  {"multBound",    Sy_bit(OPT_MULTBOUND),      ~Sy_bit(OPT_MULTBOUND)  },
549  {"degBound",     Sy_bit(OPT_DEGBOUND),       ~Sy_bit(OPT_DEGBOUND)  },
550  /* 25 no redTail(p)/redTail(s) */
551  {"redTail",      Sy_bit(OPT_REDTAIL),        ~Sy_bit(OPT_REDTAIL)  },
552  {"redThrough",   Sy_bit(OPT_REDTHROUGH),     ~Sy_bit(OPT_REDTHROUGH)  },
553  {"lazy",         Sy_bit(OPT_OLDSTD),         ~Sy_bit(OPT_OLDSTD)  },
554  {"intStrategy",  Sy_bit(OPT_INTSTRATEGY),    ~Sy_bit(OPT_INTSTRATEGY)  },
555  {"infRedTail",   Sy_bit(OPT_INFREDTAIL),     ~Sy_bit(OPT_INFREDTAIL)  },
556  /* 30: use not regularity for syz */
557  {"notRegularity",Sy_bit(OPT_NOTREGULARITY),  ~Sy_bit(OPT_NOTREGULARITY)  },
558  {"weightM",      Sy_bit(OPT_WEIGHTM),        ~Sy_bit(OPT_WEIGHTM)  },
559/*special for "none" and also end marker for showOption:*/
560  {"ne",           0,                          0 }
561};
562
563const struct soptionStruct verboseStruct[]=
564{
565  {"assign_none",Sy_bit(V_ASSIGN_NONE),~Sy_bit(V_ASSIGN_NONE)},
566  {"mem",      Sy_bit(V_SHOW_MEM),  ~Sy_bit(V_SHOW_MEM)   },
567  {"yacc",     Sy_bit(V_YACC),      ~Sy_bit(V_YACC)       },
568  {"redefine", Sy_bit(V_REDEFINE),  ~Sy_bit(V_REDEFINE)   },
569  {"reading",  Sy_bit(V_READING),   ~Sy_bit(V_READING)    },
570  {"loadLib",  Sy_bit(V_LOAD_LIB),  ~Sy_bit(V_LOAD_LIB)   },
571  {"debugLib", Sy_bit(V_DEBUG_LIB), ~Sy_bit(V_DEBUG_LIB)  },
572  {"loadProc", Sy_bit(V_LOAD_PROC), ~Sy_bit(V_LOAD_PROC)  },
573  {"defRes",   Sy_bit(V_DEF_RES),   ~Sy_bit(V_DEF_RES)    },
574  {"usage",    Sy_bit(V_SHOW_USE),  ~Sy_bit(V_SHOW_USE)   },
575  {"Imap",     Sy_bit(V_IMAP),      ~Sy_bit(V_IMAP)       },
576  {"prompt",   Sy_bit(V_PROMPT),    ~Sy_bit(V_PROMPT)     },
577  {"length",   Sy_bit(V_LENGTH),    ~Sy_bit(V_LENGTH)     },
578  {"notWarnSB",Sy_bit(V_NSB),       ~Sy_bit(V_NSB)        },
579  {"contentSB",Sy_bit(V_CONTENTSB), ~Sy_bit(V_CONTENTSB)  },
580  {"cancelunit",Sy_bit(V_CANCELUNIT),~Sy_bit(V_CANCELUNIT)},
581  {"modpsolve",Sy_bit(V_MODPSOLVSB),~Sy_bit(V_MODPSOLVSB)},
582  {"geometricSB",Sy_bit(V_UPTORADICAL),~Sy_bit(V_UPTORADICAL)},
583  {"findMonomials",Sy_bit(V_FINDMONOM),~Sy_bit(V_FINDMONOM)},
584  {"coefStrat",Sy_bit(V_COEFSTRAT), ~Sy_bit(V_COEFSTRAT)},
585  {"qringNF",  Sy_bit(V_QRING),     ~Sy_bit(V_QRING)},
586  {"warn",     Sy_bit(V_ALLWARN),   ~Sy_bit(V_ALLWARN)},
587  {"intersectSyz",Sy_bit(V_INTERSECT_SYZ), ~Sy_bit(V_INTERSECT_SYZ)},
588  {"intersectElim",Sy_bit(V_INTERSECT_ELIM), ~Sy_bit(V_INTERSECT_ELIM)},
589/*special for "none" and also end marker for showOption:*/
590  {"ne",         0,          0 }
591};
592
593BOOLEAN setOption(leftv res, leftv v)
594{
595  const char *n;
596  do
597  {
598    if (v->Typ()==STRING_CMD)
599    {
600      n=(const char *)v->CopyD(STRING_CMD);
601    }
602    else
603    {
604      if (v->name==NULL)
605        return TRUE;
606      if (v->rtyp==0)
607      {
608        n=v->name;
609        v->name=NULL;
610      }
611      else
612      {
613        n=omStrDup(v->name);
614      }
615    }
616
617    int i;
618
619    if(strcmp(n,"get")==0)
620    {
621      intvec *w=new intvec(2);
622      (*w)[0]=si_opt_1;
623      (*w)[1]=si_opt_2;
624      res->rtyp=INTVEC_CMD;
625      res->data=(void *)w;
626      goto okay;
627    }
628    if(strcmp(n,"set")==0)
629    {
630      if((v->next!=NULL)
631      &&(v->next->Typ()==INTVEC_CMD))
632      {
633        v=v->next;
634        intvec *w=(intvec*)v->Data();
635        si_opt_1=(*w)[0];
636        si_opt_2=(*w)[1];
637#if 0
638        if (TEST_OPT_INTSTRATEGY && (currRing!=NULL)
639        && rField_has_simple_inverse()
640        && !rField_is_Ring(currRing)
641        ) {
642          si_opt_1 &=~Sy_bit(OPT_INTSTRATEGY);
643        }
644#endif
645        goto okay;
646      }
647    }
648    if(strcmp(n,"none")==0)
649    {
650      si_opt_1=0;
651      si_opt_2=0;
652      goto okay;
653    }
654    for (i=0; (i==0) || (optionStruct[i-1].setval!=0); i++)
655    {
656      if (strcmp(n,optionStruct[i].name)==0)
657      {
658        if (optionStruct[i].setval & validOpts)
659        {
660          si_opt_1 |= optionStruct[i].setval;
661          // optOldStd disables redthrough
662          if (optionStruct[i].setval == Sy_bit(OPT_OLDSTD))
663            si_opt_1 &= ~Sy_bit(OPT_REDTHROUGH);
664        }
665        else
666          WarnS("cannot set option");
667#if 0
668        if (TEST_OPT_INTSTRATEGY && (currRing!=NULL)
669        && rField_has_simple_inverse()
670        && !rField_is_Ring(currRing)
671        ) {
672          test &=~Sy_bit(OPT_INTSTRATEGY);
673        }
674#endif
675        goto okay;
676      }
677      else if ((strncmp(n,"no",2)==0)
678      && (strcmp(n+2,optionStruct[i].name)==0))
679      {
680        if (optionStruct[i].setval & validOpts)
681        {
682          si_opt_1 &= optionStruct[i].resetval;
683        }
684        else
685          WarnS("cannot clear option");
686        goto okay;
687      }
688    }
689    for (i=0; (i==0) || (verboseStruct[i-1].setval!=0); i++)
690    {
691      if (strcmp(n,verboseStruct[i].name)==0)
692      {
693        si_opt_2 |= verboseStruct[i].setval;
694        #ifdef YYDEBUG
695        #if YYDEBUG
696        /*debugging the bison grammar --> grammar.cc*/
697        extern int    yydebug;
698        if (BVERBOSE(V_YACC)) yydebug=1;
699        else                  yydebug=0;
700        #endif
701        #endif
702        goto okay;
703      }
704      else if ((strncmp(n,"no",2)==0)
705      && (strcmp(n+2,verboseStruct[i].name)==0))
706      {
707        si_opt_2 &= verboseStruct[i].resetval;
708        #ifdef YYDEBUG
709        #if YYDEBUG
710        /*debugging the bison grammar --> grammar.cc*/
711        extern int    yydebug;
712        if (BVERBOSE(V_YACC)) yydebug=1;
713        else                  yydebug=0;
714        #endif
715        #endif
716        goto okay;
717      }
718    }
719    Werror("unknown option `%s`",n);
720  okay:
721    if (currRing != NULL)
722      currRing->options = si_opt_1 & TEST_RINGDEP_OPTS;
723    omFree((ADDRESS)n);
724    v=v->next;
725  } while (v!=NULL);
726
727   // set global variable to show memory usage
728  extern int om_sing_opt_show_mem;
729  if (BVERBOSE(V_SHOW_MEM)) om_sing_opt_show_mem = 1;
730  else om_sing_opt_show_mem = 0;
731
732  return FALSE;
733}
734
735char * showOption()
736{
737  int i;
738  BITSET tmp;
739
740  StringSetS("//options:");
741  if ((si_opt_1!=0)||(si_opt_2!=0))
742  {
743    tmp=si_opt_1;
744    if(tmp)
745    {
746      for (i=0; optionStruct[i].setval!=0; i++)
747      {
748        if (optionStruct[i].setval & tmp)
749        {
750          StringAppend(" %s",optionStruct[i].name);
751          tmp &=optionStruct[i].resetval;
752        }
753      }
754      for (i=0; i<32; i++)
755      {
756        if (tmp & Sy_bit(i)) StringAppend(" %d",i);
757      }
758    }
759    tmp=si_opt_2;
760    if (tmp)
761    {
762      for (i=0; verboseStruct[i].setval!=0; i++)
763      {
764        if (verboseStruct[i].setval & tmp)
765        {
766          StringAppend(" %s",verboseStruct[i].name);
767          tmp &=verboseStruct[i].resetval;
768        }
769      }
770      for (i=1; i<32; i++)
771      {
772        if (tmp & Sy_bit(i)) StringAppend(" %d",i+32);
773      }
774    }
775    return StringEndS();
776  }
777  StringAppendS(" none");
778  return StringEndS();
779}
780
781/* version strings */
782#ifdef HAVE_FLINT
783extern "C"
784{
785#ifndef __GMP_BITS_PER_MP_LIMB
786#define __GMP_BITS_PER_MP_LIMB GMP_LIMB_BITS
787#endif
788#include <flint/flint.h>
789}
790#endif
791
792#ifndef MAKE_DISTRIBUTION
793const char *singular_date=__DATE__ " " __TIME__;
794#endif
795
796char * versionString(/*const bool bShowDetails = false*/ )
797{
798  StringSetS("");
799  StringAppend("Singular for %s version %s (%d, %d bit) %s #%s",
800               S_UNAME, VERSION, // SINGULAR_VERSION,
801               SINGULAR_VERSION, sizeof(void*)*8,
802#ifdef MAKE_DISTRIBUTION
803               VERSION_DATE, GIT_VERSION);
804#else
805               singular_date, GIT_VERSION);
806#endif
807  StringAppendS("\nwith\n\t");
808
809#if defined(mpir_version)
810              StringAppend("MPIR(%s)~GMP(%s),", mpir_version, gmp_version);
811#elif defined(gmp_version)
812              // #if defined (__GNU_MP_VERSION) && defined (__GNU_MP_VERSION_MINOR)
813              //              StringAppend("GMP(%d.%d),",__GNU_MP_VERSION,__GNU_MP_VERSION_MINOR);
814              StringAppend("GMP(%s),", gmp_version);
815#endif
816#ifdef HAVE_NTL
817#include <NTL/version.h>
818              StringAppend("NTL(%s),",NTL_VERSION);
819#endif
820
821#ifdef HAVE_FLINT
822              StringAppend("FLINT(%s),",version);
823#endif
824              StringAppendS("factory(" FACTORYVERSION "),\n\t");
825#ifdef XMEMORY_H
826              StringAppendS("xalloc,");
827#else
828              StringAppendS("omalloc,");
829#endif
830#if defined(HAVE_DYN_RL)
831              if (fe_fgets_stdin==fe_fgets_dummy)
832                StringAppendS("no input,");
833              else if (fe_fgets_stdin==fe_fgets)
834                StringAppendS("fgets,");
835              if (fe_fgets_stdin==fe_fgets_stdin_drl)
836                StringAppend("dynamic readline%d),",RL_VERSION_MAJOR);
837              #ifdef HAVE_FEREAD
838              else if (fe_fgets_stdin==fe_fgets_stdin_emu)
839                StringAppendS("emulated readline,");
840              #endif
841              else
842                StringAppendS("unknown fgets method,");
843#else
844  #if defined(HAVE_READLINE) && !defined(FEREAD)
845              StringAppend("static readline(%d),",RL_VERSION_MAJOR);
846  #else
847    #ifdef HAVE_FEREAD
848              StringAppendS("emulated readline,");
849    #else
850              StringAppendS("fgets,");
851    #endif
852  #endif
853#endif
854#ifdef HAVE_PLURAL
855              StringAppendS("Plural,");
856#endif
857#ifdef HAVE_DBM
858              StringAppendS("DBM,\n\t");
859#else
860              StringAppendS("\n\t");
861#endif
862#ifdef HAVE_DYNAMIC_LOADING
863              StringAppendS("dynamic modules,");
864#endif
865              if (p_procs_dynamic) StringAppendS("dynamic p_Procs,");
866#if YYDEBUG
867              StringAppendS("YYDEBUG=1,");
868#endif
869#ifdef HAVE_ASSUME
870             StringAppendS("ASSUME,");
871#endif
872#ifdef MDEBUG
873              StringAppend("MDEBUG=%d,",MDEBUG);
874#endif
875#ifdef OM_CHECK
876              StringAppend("OM_CHECK=%d,",OM_CHECK);
877#endif
878#ifdef OM_TRACK
879              StringAppend("OM_TRACK=%d,",OM_TRACK);
880#endif
881#ifdef OM_NDEBUG
882              StringAppendS("OM_NDEBUG,");
883#endif
884#ifdef SING_NDEBUG
885              StringAppendS("SING_NDEBUG,");
886#endif
887#ifdef PDEBUG
888              StringAppendS("PDEBUG,");
889#endif
890#ifdef KDEBUG
891              StringAppendS("KDEBUG,");
892#endif
893#ifdef __OPTIMIZE__
894              StringAppendS("CC:OPTIMIZE,");
895#endif
896#ifdef __OPTIMIZE_SIZE__
897              StringAppendS("CC:OPTIMIZE_SIZE,");
898#endif
899#ifdef __NO_INLINE__
900              StringAppendS("CC:NO_INLINE,");
901#endif
902#ifdef HAVE_EIGENVAL
903              StringAppendS("eigenvalues,");
904#endif
905#ifdef HAVE_GMS
906              StringAppendS("Gauss-Manin system,");
907#endif
908#ifdef HAVE_RATGRING
909              StringAppendS("ratGB,");
910#endif
911              StringAppend("random=%d\n",siRandomStart);
912
913#define SI_SHOW_BUILTIN_MODULE(name) StringAppend(" %s", #name);
914              StringAppendS("built-in modules: {");
915              SI_FOREACH_BUILTIN(SI_SHOW_BUILTIN_MODULE)
916              StringAppendS("}\n");
917#undef SI_SHOW_BUILTIN_MODULE
918
919              StringAppend("AC_CONFIGURE_ARGS = %s,\n"
920                           "CC = %s,FLAGS : %s,\n"
921                           "CXX = %s,FLAGS : %s,\n"
922                           "DEFS : %s,CPPFLAGS : %s,\n"
923                           "LDFLAGS : %s,LIBS : %s "
924#ifdef __GNUC__
925              "(ver: " __VERSION__ ")"
926#endif
927              "\n",AC_CONFIGURE_ARGS, CC,CFLAGS, CXX,CXXFLAGS,  DEFS,CPPFLAGS,  LDFLAGS,LIBS);
928              feStringAppendResources(0);
929              feStringAppendBrowsers(0);
930              StringAppendS("\n");
931              return StringEndS();
932}
933
934#ifdef PDEBUG
935#if (OM_TRACK > 2) && defined(OM_TRACK_CUSTOM)
936void p_SetRingOfLeftv(leftv l, ring r)
937{
938  switch(l->rtyp)
939  {
940    case INT_CMD:
941    case BIGINT_CMD:
942    case IDHDL:
943    case DEF_CMD:
944      break;
945    case POLY_CMD:
946    case VECTOR_CMD:
947    {
948      poly p=(poly)l->data;
949      while(p!=NULL) { p_SetRingOfLm(p,r); pIter(p); }
950      break;
951    }
952    case IDEAL_CMD:
953    case MODUL_CMD:
954    case MATRIX_CMD:
955    {
956      ideal I=(ideal)l->data;
957      int i;
958      for(i=IDELEMS(I)-1;i>=0;i--)
959      {
960        poly p=I->m[i];
961        while(p!=NULL) { p_SetRingOfLm(p,r); pIter(p); }
962      }
963      break;
964    }
965    case COMMAND:
966    {
967      command d=(command)l->data;
968      p_SetRingOfLeftv(&d->arg1, r);
969      if (d->argc>1) p_SetRingOfLeftv(&d->arg2, r);
970      if (d->argc>2) p_SetRingOfLeftv(&d->arg3, r);
971      break;
972    }
973    default:
974     printf("type %d not yet implementd in p_SetRingOfLeftv\n",l->rtyp);
975     break;
976  }
977}
978#endif
979#endif
980
981#if 0 /* debug only */
982void listall(int showproc)
983{
984      idhdl hh=basePack->idroot;
985      PrintS("====== Top ==============\n");
986      while (hh!=NULL)
987      {
988        if (showproc || (IDTYP(hh)!=PROC_CMD))
989        {
990          if (IDDATA(hh)==(void *)currRing) PrintS("(R)");
991          else if (IDDATA(hh)==(void *)currPack) PrintS("(P)");
992          else PrintS("   ");
993          Print("::%s, typ %s level %d data %lx",
994                 IDID(hh),Tok2Cmdname(IDTYP(hh)),IDLEV(hh),(long)IDDATA(hh));
995          if (IDTYP(hh)==RING_CMD)
996            Print(" ref: %d\n",IDRING(hh)->ref);
997          else
998            PrintLn();
999        }
1000        hh=IDNEXT(hh);
1001      }
1002      hh=basePack->idroot;
1003      while (hh!=NULL)
1004      {
1005        if (IDDATA(hh)==(void *)basePack)
1006          Print("(T)::%s, typ %s level %d data %lx\n",
1007          IDID(hh),Tok2Cmdname(IDTYP(hh)),IDLEV(hh),(long)IDDATA(hh));
1008        else
1009        if ((IDTYP(hh)==RING_CMD)
1010        || (IDTYP(hh)==PACKAGE_CMD))
1011        {
1012          Print("====== %s ==============\n",IDID(hh));
1013          idhdl h2=IDRING(hh)->idroot;
1014          while (h2!=NULL)
1015          {
1016            if (showproc || (IDTYP(h2)!=PROC_CMD))
1017            {
1018              if ((IDDATA(h2)==(void *)currRing)
1019              && (IDTYP(h2)==RING_CMD))
1020                PrintS("(R)");
1021              else if (IDDATA(h2)==(void *)currPack) PrintS("(P)");
1022              else PrintS("   ");
1023              Print("%s::%s, typ %s level %d data %lx\n",
1024              IDID(hh),IDID(h2),Tok2Cmdname(IDTYP(h2)),IDLEV(h2),(long)IDDATA(h2));
1025            }
1026            h2=IDNEXT(h2);
1027          }
1028        }
1029        hh=IDNEXT(hh);
1030      }
1031      Print("currRing:%lx, currPack:%lx,basePack:%lx\n",(long)currRing,(long)currPack,(long)basePack);
1032      iiCheckPack(currPack);
1033}
1034#endif
1035
1036#ifndef SING_NDEBUG
1037void checkall()
1038{
1039      idhdl hh=basePack->idroot;
1040      while (hh!=NULL)
1041      {
1042        omCheckAddr(hh);
1043        omCheckAddr((ADDRESS)IDID(hh));
1044        if (RingDependend(IDTYP(hh)))
1045        {
1046          Print("%s typ %d in Top (should be in ring)\n",IDID(hh),IDTYP(hh));
1047        }
1048        hh=IDNEXT(hh);
1049      }
1050      hh=basePack->idroot;
1051      while (hh!=NULL)
1052      {
1053        if (IDTYP(hh)==PACKAGE_CMD)
1054        {
1055          idhdl h2=NULL;
1056          if (IDPACKAGE(hh)!=NULL)
1057            h2=IDPACKAGE(hh)->idroot;
1058          if (IDPACKAGE(hh)!=basePack)
1059          {
1060            while (h2!=NULL)
1061            {
1062              omCheckAddr(h2);
1063              omCheckAddr((ADDRESS)IDID(h2));
1064              if (RingDependend(IDTYP(h2)))
1065              {
1066                Print("%s typ %d in %s (should be in ring)\n",IDID(h2),IDTYP(h2),IDID(hh));
1067              }
1068              h2=IDNEXT(h2);
1069            }
1070          }
1071        }
1072        hh=IDNEXT(hh);
1073      }
1074}
1075#endif
1076
1077#include <sys/types.h>
1078#include <sys/stat.h>
1079#include <unistd.h>
1080
1081extern "C"
1082int singular_fstat(int fd, struct stat *buf)
1083{
1084  return si_fstat(fd,buf);
1085}
1086
1087/*2
1088* the global exit routine of Singular
1089*/
1090extern "C" {
1091/* Note: We cannot use a mutex here because mutexes are not async-safe, but
1092 * m2_end is called by sig_term_hdl(). Anyway, the race condition in the first
1093 * few lines of m2_end() should not matter.
1094 */
1095volatile BOOLEAN m2_end_called = FALSE;
1096
1097void m2_end(int i)
1098{
1099  if (!m2_end_called)
1100  {
1101    extern FILE* File_Profiling;
1102    if (File_Profiling!=NULL) { fclose(File_Profiling); File_Profiling=NULL; }
1103    m2_end_called = TRUE;
1104#ifdef HAVE_SIMPLEIPC
1105    for (int j = SIPC_MAX_SEMAPHORES-1; j >= 0; j--)
1106    {
1107      if (semaphore[j] != NULL)
1108      {
1109        while (sem_acquired[j] > 0)
1110        {
1111#if PORTABLE_SEMAPHORES
1112          sem_post(semaphore[j]->sig);
1113#else
1114          sem_post(semaphore[j]);
1115#endif
1116          sem_acquired[j]--;
1117        }
1118      }
1119    }
1120#endif   // HAVE_SIMPLEIPC
1121    fe_reset_input_mode();
1122    monitor(NULL,0);
1123#ifdef PAGE_TEST
1124    mmEndStat();
1125#endif
1126    fe_reset_input_mode();
1127    if (ssiToBeClosed_inactive)
1128    {
1129      link_list hh=ssiToBeClosed;
1130      while(hh!=NULL)
1131      {
1132        //Print("close %s\n",hh->l->name);
1133        slPrepClose(hh->l);
1134        hh=(link_list)hh->next;
1135      }
1136      ssiToBeClosed_inactive=FALSE;
1137
1138      idhdl h = currPack->idroot;
1139      while(h != NULL)
1140      {
1141        if(IDTYP(h) == LINK_CMD)
1142        {
1143          idhdl hh=h->next;
1144          //Print("kill %s\n",IDID(h));
1145          killhdl(h, currPack);
1146          h = hh;
1147        }
1148        else
1149        {
1150          h = h->next;
1151        }
1152      }
1153      hh=ssiToBeClosed;
1154      while(hh!=NULL)
1155      {
1156        //Print("close %s\n",hh->l->name);
1157        slClose(hh->l);
1158        hh=ssiToBeClosed;
1159      }
1160    }
1161    if (!singular_in_batchmode)
1162    {
1163      if (i<=0)
1164      {
1165        //extern long all_farey;
1166        //extern long farey_cnt;
1167        //if (all_farey!=0L) printf("farey:%ld, cnt=%ld\n",all_farey,farey_cnt);
1168        if (TEST_V_QUIET)
1169        {
1170          if (i==0)
1171            printf("Auf Wiedersehen.\n");
1172          else
1173            printf("\n$Bye.\n");
1174        }
1175        //#ifdef sun
1176        //  #ifndef __svr4__
1177        //    _cleanup();
1178        //    _exit(0);
1179        //  #endif
1180        //#endif
1181        i=0;
1182      }
1183      else
1184      {
1185        printf("\nhalt %d\n",i);
1186      }
1187    }
1188    exit(i);
1189  }
1190}
1191}
1192
1193extern "C"
1194{
1195  void omSingOutOfMemoryFunc()
1196  {
1197    fprintf(stderr, "\nSingular error: no more memory\n");
1198    omPrintStats(stderr);
1199    m2_end(14);
1200    /* should never get here */
1201    exit(1);
1202  }
1203}
1204
1205#ifdef SINGULAR_4_2
1206static n_coeffType n_pAE=n_unknown;
1207static BOOLEAN ii_pAE_init(leftv res,leftv a)
1208{
1209  if (a->Typ()!=INT_CMD)
1210  {
1211    WerrorS("`int` expected");
1212    return TRUE;
1213  }
1214  else
1215  {
1216    res->rtyp=CRING_CMD;
1217    res->data=(void*)nInitChar(n_pAE,(void*)a->Data());
1218    return FALSE;
1219  }
1220}
1221#endif
1222#ifdef HAVE_FLINT
1223static n_coeffType n_FlintZn=n_unknown;
1224static BOOLEAN ii_FlintZn_init(leftv res,leftv a)
1225{
1226  if ((a->Typ()!=INT_CMD)
1227  ||(a->next==NULL)
1228  ||(a->next->Typ()!=STRING_CMD))
1229  {
1230    WerrorS("`int`i,`string` expected");
1231    return TRUE;
1232  }
1233  else
1234  {
1235    flintZn_struct p;
1236    p.ch=(int)(long)a->Data();
1237    p.name=(char*)a->next->Data();
1238    res->rtyp=CRING_CMD;
1239    res->data=(void*)nInitChar(n_FlintZn,(void*)&p);
1240    return FALSE;
1241  }
1242}
1243#endif
1244
1245static BOOLEAN iiFloat(leftv res, leftv pnn)
1246{
1247  short float_len=3;
1248  short float_len2=SHORT_REAL_LENGTH;
1249  coeffs cf=NULL;
1250  if ((pnn!=NULL) && (pnn->Typ()==INT_CMD))
1251  {
1252    float_len=(int)(long)pnn->Data();
1253    float_len2=float_len;
1254    pnn=pnn->next;
1255    if ((pnn!=NULL) && (pnn->Typ()==INT_CMD))
1256    {
1257      float_len2=(int)(long)pnn->Data();
1258      pnn=pnn->next;
1259    }
1260  }
1261  if (float_len2 <= (short)SHORT_REAL_LENGTH)
1262       cf=nInitChar(n_R, NULL);
1263  else // longR or longC?
1264  {
1265    LongComplexInfo param;
1266    param.float_len = si_min (float_len, 32767);
1267    param.float_len2 = si_min (float_len2, 32767);
1268    cf = nInitChar(n_long_R, (void*)&param);
1269  }
1270  res->rtyp=CRING_CMD;
1271  res->data=cf;
1272  return cf==NULL;
1273}
1274static BOOLEAN iiCrossProd(leftv res, leftv args)
1275{
1276  leftv h=args;
1277  coeffs *c=NULL;
1278  coeffs cf=NULL;
1279  int i=0;
1280  if (h==NULL) goto crossprod_error;
1281  while (h!=NULL)
1282  {
1283    if (h->Typ()!=CRING_CMD) goto crossprod_error;
1284    i++;
1285    h=h->next;
1286  }
1287  c=(coeffs*)omAlloc0((i+1)*sizeof(coeffs));
1288  h=args;
1289  i=0;
1290  while (h!=NULL)
1291  {
1292    c[i]=(coeffs)h->CopyD();
1293    i++;
1294    h=h->next;
1295  }
1296  cf=nInitChar(n_nTupel,c);
1297  res->data=cf;
1298  res->rtyp=CRING_CMD;
1299  return FALSE;
1300
1301  crossprod_error:
1302    WerrorS("expected `crossprod(coeffs, ...)`");
1303    return TRUE;
1304}
1305/*2
1306* initialize components of Singular
1307*/
1308void siInit(char *name)
1309{
1310// factory default settings: -----------------------------------------------
1311  On(SW_USE_EZGCD);
1312  On(SW_USE_CHINREM_GCD);
1313  //On(SW_USE_FF_MOD_GCD);
1314  On(SW_USE_EZGCD_P);
1315  On(SW_USE_QGCD);
1316  Off(SW_USE_NTL_SORT); // may be changed by an command line option
1317  factoryError=WerrorS;
1318
1319// NTL error handling (>= 9.3.0)
1320#ifdef HAVE_NTL
1321#if (((NTL_MAJOR_VERSION==9)&&(NTL_MINOR_VERSION>=3))||(NTL_MAJOR_VERSION>=10))
1322  ErrorMsgCallback=WerrorS;
1323  ErrorCallback=HALT;
1324#endif
1325#endif
1326
1327// memory initialization: -----------------------------------------------
1328    om_Opts.OutOfMemoryFunc = omSingOutOfMemoryFunc;
1329#ifndef OM_NDEBUG
1330#ifndef __OPTIMIZE__
1331    om_Opts.ErrorHook = dErrorBreak;
1332#else
1333    om_Opts.Keep = 0; /* !OM_NDEBUG, __OPTIMIZE__*/
1334#endif
1335#else
1336    om_Opts.Keep = 0; /* OM_NDEBUG */
1337#endif
1338    omInitInfo();
1339
1340// options ---------------------------------------------------------------
1341  si_opt_1=0;
1342// interpreter tables etc.: -----------------------------------------------
1343  memset(&sLastPrinted,0,sizeof(sleftv));
1344  sLastPrinted.rtyp=NONE;
1345
1346  extern int iiInitArithmetic(); iiInitArithmetic(); // iparith.cc
1347
1348  basePack=(package)omAlloc0(sizeof(*basePack));
1349  currPack=basePack;
1350  idhdl h;
1351  h=enterid("Top", 0, PACKAGE_CMD, &IDROOT, FALSE);
1352  IDPACKAGE(h)=basePack;
1353  IDPACKAGE(h)->language = LANG_TOP;
1354  currPackHdl=h;
1355  basePackHdl=h;
1356
1357  coeffs_BIGINT = nInitChar(n_Q,(void*)1);
1358
1359#if 1
1360   // def HAVE_POLYEXTENSIONS
1361  if(TRUE)
1362  {
1363    n_coeffType type;
1364    #ifdef SINGULAR_4_2
1365    type = nRegister(n_polyExt, n2pInitChar);
1366    assume(type == n_polyExt);
1367    #endif
1368
1369    type = nRegister(n_algExt, naInitChar);
1370    assume(type == n_algExt);
1371
1372    type = nRegister(n_transExt, ntInitChar);
1373    assume(type == n_transExt);
1374
1375    (void)type;
1376  }
1377#endif
1378
1379// random generator: -----------------------------------------------
1380  int t=initTimer();
1381  if (t==0) t=1;
1382  initRTimer();
1383  siSeed=t;
1384  factoryseed(t);
1385  siRandomStart=t;
1386  feOptSpec[FE_OPT_RANDOM].value = (void*) ((long)siRandomStart);
1387
1388// ressource table: ----------------------------------------------------
1389  // Don't worry: ifdef OM_NDEBUG, then all these calls are undef'ed
1390  // hack such that all shared' libs in the bindir are loaded correctly
1391  feInitResources(name);
1392
1393// singular links: --------------------------------------------------
1394  slStandardInit();
1395  myynest=0;
1396// how many processes ? -----------------------------------------------------
1397  int cpus=2;
1398  int cpu_n;
1399  #ifdef _SC_NPROCESSORS_ONLN
1400  if ((cpu_n=sysconf(_SC_NPROCESSORS_ONLN))>cpus) cpus=cpu_n;
1401  #elif defined(_SC_NPROCESSORS_CONF)
1402  if ((cpu_n=sysconf(_SC_NPROCESSORS_CONF))>cpus) cpus=cpu_n;
1403  #endif
1404  feSetOptValue(FE_OPT_CPUS, cpus);
1405// how many threads ? -----------------------------------------------------
1406  feSetOptValue(FE_OPT_THREADS, cpus);
1407
1408// default coeffs
1409  {
1410    idhdl h;
1411    h=enterid("QQ",0/*level*/, CRING_CMD,&(basePack->idroot),FALSE /*init*/,FALSE /*search*/);
1412    IDDATA(h)=(char*)nInitChar(n_Q,NULL);
1413    h=enterid("ZZ",0/*level*/, CRING_CMD,&(basePack->idroot),FALSE /*init*/,FALSE /*search*/);
1414    IDDATA(h)=(char*)nInitChar(n_Z,NULL);
1415    iiAddCproc("kernel","crossprod",FALSE,iiCrossProd);
1416    iiAddCproc("kernel","Float",FALSE,iiFloat);
1417    //h=enterid("RR",0/*level*/, CRING_CMD,&(basePack->idroot),FALSE /*init*/,FALSE /*search*/);
1418    //IDDATA(h)=(char*)nInitChar(n_R,NULL);
1419    //h=enterid("CC",0/*level*/, CRING_CMD,&(basePack->idroot),FALSE /*init*/,FALSE /*search*/);
1420    //IDDATA(h)=(char*)nInitChar(n_long_C,NULL);
1421    n_coeffType t;
1422#ifdef SINGULAR_4_2
1423    t=nRegister(n_unknown,n_AEInitChar);
1424    if (t!=n_unknown)
1425    {
1426      h=enterid("AE",0/*level*/, CRING_CMD,&(basePack->idroot),FALSE /*init*/,FALSE /*search*/);
1427      IDDATA(h)=(char*)nInitChar(t,NULL);
1428    }
1429    t=nRegister(n_unknown,n_QAEInitChar);
1430    if (t!=n_unknown)
1431    {
1432      h=enterid("QAE",0/*level*/, CRING_CMD,&(basePack->idroot),FALSE /*init*/,FALSE /*search*/);
1433      IDDATA(h)=(char*)nInitChar(t,NULL);
1434    }
1435    n_pAE=nRegister(n_unknown,n_pAEInitChar);
1436    if (n_pAE!=n_unknown)
1437    {
1438      iiAddCproc("kernel","pAE",FALSE,ii_pAE_init);
1439    }
1440#endif
1441    #ifdef HAVE_FLINT
1442    t=nRegister(n_unknown,flintQ_InitChar);
1443    if (t!=n_unknown)
1444    {
1445      h=enterid("flint_poly_Q",0/*level*/, CRING_CMD,&(basePack->idroot),FALSE /*init*/,FALSE /*search*/);
1446      IDDATA(h)=(char*)nInitChar(t,NULL);
1447    }
1448    n_FlintZn=nRegister(n_unknown,flintZn_InitChar);
1449    if (n_FlintZn!=n_unknown)
1450    {
1451      iiAddCproc("kernel","flintZ",FALSE,ii_FlintZn_init);
1452    }
1453    #endif
1454  }
1455// setting routines for PLURAL QRINGS:
1456// allowing to use libpolys without libSingular(kStd)
1457#ifdef HAVE_PLURAL
1458  nc_NF=k_NF;
1459  gnc_gr_bba=k_gnc_gr_bba;
1460  gnc_gr_mora=k_gnc_gr_mora;
1461  sca_bba=k_sca_bba;
1462  sca_mora=k_sca_mora;
1463  sca_gr_bba=k_sca_gr_bba;
1464#endif
1465// loading standard.lib -----------------------------------------------
1466  if (! feOptValue(FE_OPT_NO_STDLIB))
1467  {
1468    BITSET save1,save2;
1469    SI_SAVE_OPT(save1,save2);
1470    si_opt_2 &= ~Sy_bit(V_LOAD_LIB);
1471    iiLibCmd(omStrDup("standard.lib"), TRUE,TRUE,TRUE);
1472    SI_RESTORE_OPT(save1,save2);
1473  }
1474  errorreported = 0;
1475}
Note: See TracBrowser for help on using the repository browser.