My Project  UNKNOWN_GIT_VERSION
p_Procs_Set.h
Go to the documentation of this file.
1 /****************************************
2 * Computer Algebra System SINGULAR *
3 ****************************************/
4 /***************************************************************
5  * File: p_Procs_Set.h
6  * Purpose: Procedures for setting p_Procs at run time
7  * Note: this file is included by p_Procs_Dynamic/Static.cc
8  * The macros
9  * DoSetProc(what, field, length, ord)
10  * InitSetProc(field, length ord)
11  * have to be defined before this file is included
12  * Author: obachman (Olaf Bachmann)
13  * Created: 12/00
14  *******************************************************************/
15 
16 #include "reporter/reporter.h"
17 #include "misc/auxiliary.h"
18 
19 // extract p_Procs properties from a ring
20 static inline p_Field p_FieldIs(ring r)
21 {
22  if (rField_is_Zp(r))
23  return FieldZp;
24  if (rField_is_R(r)) return FieldR;
25  if (rField_is_GF(r)) return FieldGF;
26  if (rField_is_Q(r)) return FieldQ;
27 #ifdef HAVE_MORE_FIELDS_IMPLEMENTED
28  if (rField_is_long_R(r)) return FieldLong_R;
29  if (rField_is_long_C(r)) return FieldLong_C;
30  if (rField_is_Zp_a(r)) return FieldZp_a;
31  if (rField_is_Q_a(r)) return FieldQ_a;
32 #endif
33  if (rField_is_Ring(r)) return RingGeneral;
34  return FieldGeneral;
35 }
36 
37 static inline p_Length p_LengthIs(ring r)
38 {
39  assume(r->ExpL_Size > 0);
40  // here is a quick hack to take care of p_MemAddAdjust
41  if (r->NegWeightL_Offset != NULL) return LengthGeneral;
42  if (r->ExpL_Size == 1) return LengthOne;
43  if (r->ExpL_Size == 2) return LengthTwo;
44  if (r->ExpL_Size == 3) return LengthThree;
45  if (r->ExpL_Size == 4) return LengthFour;
46  if (r->ExpL_Size == 5) return LengthFive;
47  if (r->ExpL_Size == 6) return LengthSix;
48  if (r->ExpL_Size == 7) return LengthSeven;
49  if (r->ExpL_Size == 8) return LengthEight;
50  return LengthGeneral;
51 }
52 
53 static inline int p_IsNomog(long* sgn, int l)
54 {
55  int i;
56  for (i=0;i<l;i++)
57  if (sgn[i] > 0) return 0;
58 
59  return 1;
60 }
61 
62 static inline int p_IsPomog(long* sgn, int l)
63 {
64  int i;
65  for (i=0;i<l;i++)
66  if (sgn[i] < 0) return 0;
67  return 1;
68 }
69 
70 static inline p_Ord p_OrdIs(ring r)
71 {
72  long* sgn = r->ordsgn;
73  long l = r->ExpL_Size;
74  int zero = 0;
75 
76  if (sgn[l-1] == 0)
77  {
78  l--;
79  zero = 1;
80  }
81 
82  // we always favour the pomog cases
83  if (p_IsPomog(sgn,l)) return (zero ? OrdPomogZero : OrdPomog);
84  if (p_IsNomog(sgn,l)) return (zero ? OrdNomogZero : OrdNomog);
85 
86  assume(l > 1);
87 
88  if (sgn[0] == -1 && p_IsPomog(&sgn[1], l-1))
89  return (zero ? OrdNegPomogZero : OrdNegPomog);
90  if (sgn[l-1] == -1 && p_IsPomog(sgn, l-1))
91  return (zero ? OrdPomogNegZero : OrdPomogNeg);
92 
93  if (sgn[0] == 1 && p_IsNomog(&sgn[1], l-1))
94  return (zero ? OrdPosNomogZero : OrdPosNomog);
95  if (sgn[l-1] == 1 && p_IsNomog(sgn, l-1))
96  return (zero ? OrdNomogPosZero : OrdNomogPos);
97 
98  assume(l > 2);
99 
100  if (sgn[0] == 1 && sgn[1] == 1 && p_IsNomog(&sgn[2], l-2))
101  return (zero ? OrdPosPosNomogZero : OrdPosPosNomog);
102 
103  if (sgn[0] == 1 && sgn[l-1] == 1 && p_IsNomog(&sgn[1], l-2))
104  return (zero ? OrdPosNomogPosZero : OrdPosNomogPos);
105 
106  if (sgn[0] == -1 && sgn[1] == 1 && p_IsNomog(&sgn[2], l-2))
107  return (zero ? OrdNegPosNomogZero : OrdNegPosNomog);
108 
109  return OrdGeneral;
110 }
111 
112 // fields of this struct are set by DoSetProc
114 
115 #ifdef RDEBUG
116 // if set, then SetProcs sets only names, instead of functions
117 static int set_names = 0;
118 #endif
119 
120 // (which##_Proc_Ptr)F ->-> cast_vptr_to_A<which##_Proc_Ptr>(F)?
121 #define CheckProc(which) \
122 do \
123 { \
124  if (p_Procs->which == NULL) \
125  { \
126  dReportBug("p_Procs is NULL"); \
127  WarnS("Singular will work properly, but much slower"); \
128  WarnS("If you chose a coef ring, it may not work at all");\
129  p_Procs->which = (which##_Proc_Ptr)( \
130  which##__FieldGeneral_LengthGeneral_OrdGeneral); \
131  } \
132 } \
133 while (0);
134 
135 void nc_p_ProcsSet(ring rGR, p_Procs_s* p_Procs);
136 
137 // Choose a set of p_Procs
138 void p_ProcsSet(ring r, p_Procs_s* p_Procs)
139 {
140  p_Field field = p_FieldIs(r);
142  p_Ord ord = p_OrdIs(r);
143 
144  assume(p_Procs != NULL);
145  memset(p_Procs, 0, sizeof(p_Procs_s));
146  _p_procs = p_Procs;
147 
148  SetProcs(field, length, ord);
149  extern poly p_Mult_nn_pthread(poly p, const number n, const ring r);
150  #ifdef NV_OPS
151  if ((field==FieldZp) && (r->cf->ch>NV_MAX_PRIME))
152  {
153  // set all (mult/div.) routines to FieldGeneral-variants
154  SetProcs(FieldGeneral, length,ord); // p_Mult_nn, ...
155  // set all non-mult/div. routines to FieldZp-variants
156  SetProcs_nv(FieldZp, length,ord); // p_Delete, p_ShallowCopyDelete...
157  }
158  if (field==RingGeneral)
159  {
160  if (nCoeff_is_Domain(r->cf))
162  // FieldGeneral vs. RingGeneral: HAVE_ZERODIVISORS
163  else
165  }
166  #endif
169  CheckProc(p_Copy);
177  CheckProc(pp_Mult_mm_Noether);
179  CheckProc(p_Neg);
181  CheckProc(pp_Mult_Coeff_mm_DivSelectMult);
183  CheckProc(p_kBucketSetLm);
184 
185 /*
186  assume(p_Procs->pp_Mult_mm_Noether != pp_Mult_mm_Noether__FieldGeneral_LengthGeneral_OrdGeneral ||
187  p_Procs->p_Minus_mm_Mult_qq == p_Minus_mm_Mult_qq__FieldGeneral_LengthGeneral_OrdGeneral ||
188  r->OrdSgn == 1 || r->LexOrder);
189 */
190 #ifdef HAVE_PLURAL
191 #ifndef SING_NDEBUG
192  if (rIsPluralRing(r))
193  {
194  dReportError("Setting pProcs in p_ProcsSet (rDebugPrint!?)!!!");
195  nc_p_ProcsSet(r, _p_procs); // Setup non-commutative p_Procs table!
196  }
197 #endif
198 #endif
199 }
200 
201 #ifdef RDEBUG
202 void p_Debug_GetSpecNames(const ring r, const char* &field, const char* &length, const char* &ord)
203 {
204  /*p_Field e_field =*/ (void) p_FieldIs(r);
205  /*p_Length e_length =*/ (void) p_LengthIs(r);
206  /*p_Ord e_ord =*/ (void) p_OrdIs(r);
207 
208  field = p_FieldEnum_2_String(p_FieldIs(r));
210  ord = p_OrdEnum_2_String(p_OrdIs(r));
211 }
212 
213 void p_Debug_GetProcNames(const ring r, p_Procs_s* p_Procs)
214 {
215  set_names = 1;
216  p_ProcsSet(r, p_Procs); // changes p_Procs!!!
217  set_names = 0;
218 }
219 #endif // RDEBUG
FieldGeneral
@ FieldGeneral
Definition: p_Procs_Impl.h:112
p_Procs_s::p_mm_Mult
p_Mult_mm_Proc_Ptr p_mm_Mult
Definition: p_Procs.h:52
dReportError
int dReportError(const char *fmt,...)
Definition: dError.cc:45
rField_is_long_R
static BOOLEAN rField_is_long_R(const ring r)
Definition: ring.h:533
OrdPosNomogZero
@ OrdPosNomogZero
Definition: p_Procs_Impl.h:168
p_IsPomog
static int p_IsPomog(long *sgn, int l)
Definition: p_Procs_Set.h:62
p_ProcsSet
void p_ProcsSet(ring r, p_Procs_s *p_Procs)
Definition: p_Procs_Set.h:138
LengthGeneral
@ LengthGeneral
Definition: p_Procs_Impl.h:124
p_FieldIs
static p_Field p_FieldIs(ring r)
Definition: p_Procs_Set.h:20
p_IsNomog
static int p_IsNomog(long *sgn, int l)
Definition: p_Procs_Set.h:53
p_Merge_q
static poly p_Merge_q(poly p, poly q, const ring r)
Definition: p_polys.h:1149
p_Procs_s
Definition: p_Procs.h:41
p_Ord
p_Ord
Definition: p_Procs_Impl.h:135
p_LengthIs
static p_Length p_LengthIs(ring r)
Definition: p_Procs_Set.h:37
p_Mult_mm
static poly p_Mult_mm(poly p, poly m, const ring r)
Definition: p_polys.h:998
p_Neg
static poly p_Neg(poly p, const ring r)
Definition: p_polys.h:1044
LengthFive
@ LengthFive
Definition: p_Procs_Impl.h:128
p_Minus_mm_Mult_qq
static poly p_Minus_mm_Mult_qq(poly p, const poly m, const poly q, int &lp, int lq, const poly spNoether, const ring r)
Definition: p_polys.h:1007
p_Debug_GetSpecNames
void p_Debug_GetSpecNames(const ring r, const char *&field, const char *&length, const char *&ord)
Definition: p_Procs_Set.h:202
OrdNegPosNomogZero
@ OrdNegPosNomogZero
Definition: p_Procs_Impl.h:172
length
static BOOLEAN length(leftv result, leftv arg)
Definition: interval.cc:263
p_ShallowCopyDelete
static poly p_ShallowCopyDelete(poly p, const ring r, omBin bin)
Definition: p_polys.h:885
CheckProc
#define CheckProc(which)
Definition: p_Procs_Set.h:121
LengthOne
@ LengthOne
Definition: p_Procs_Impl.h:132
OrdNomog
@ OrdNomog
Definition: p_Procs_Impl.h:141
p_LengthEnum_2_String
static const char * p_LengthEnum_2_String(p_Length length)
Definition: p_Procs_Impl.h:219
pp_Mult_mm
static poly pp_Mult_mm(poly p, poly m, const ring r)
Definition: p_polys.h:988
auxiliary.h
LengthEight
@ LengthEight
Definition: p_Procs_Impl.h:125
rField_is_Zp_a
static BOOLEAN rField_is_Zp_a(const ring r)
Definition: ring.h:520
reporter.h
FieldLong_R
@ FieldLong_R
Definition: p_Procs_Impl.h:118
p_OrdEnum_2_String
static const char * p_OrdEnum_2_String(p_Ord ord)
Definition: p_Procs_Impl.h:237
p_Field
p_Field
Definition: p_Procs_Impl.h:106
pp_Mult_Coeff_mm_DivSelect
static poly pp_Mult_Coeff_mm_DivSelect(poly p, const poly m, const ring r)
Definition: p_polys.h:1027
OrdPosNomogPosZero
@ OrdPosNomogPosZero
Definition: p_Procs_Impl.h:171
FieldLong_C
@ FieldLong_C
Definition: p_Procs_Impl.h:119
rIsPluralRing
static BOOLEAN rIsPluralRing(const ring r)
we must always have this test!
Definition: ring.h:398
set_names
static int set_names
Definition: p_Procs_Set.h:117
LengthTwo
@ LengthTwo
Definition: p_Procs_Impl.h:131
FieldQ_a
@ FieldQ_a
Definition: p_Procs_Impl.h:121
OrdPomogZero
@ OrdPomogZero
Definition: p_Procs_Impl.h:145
OrdNegPomog
@ OrdNegPomog
Definition: p_Procs_Impl.h:149
p_Copy
static poly p_Copy(poly p, const ring r)
returns a copy of p
Definition: p_polys.h:813
i
int i
Definition: cfEzgcd.cc:125
rField_is_Q_a
static BOOLEAN rField_is_Q_a(const ring r)
Definition: ring.h:530
OrdPosNomogPos
@ OrdPosNomogPos
Definition: p_Procs_Impl.h:162
OrdPosNomog
@ OrdPosNomog
Definition: p_Procs_Impl.h:153
OrdPomogNegZero
@ OrdPomogNegZero
Definition: p_Procs_Impl.h:158
OrdNegPomogZero
@ OrdNegPomogZero
Definition: p_Procs_Impl.h:157
LengthFour
@ LengthFour
Definition: p_Procs_Impl.h:129
rField_is_Ring
static BOOLEAN rField_is_Ring(const ring r)
Definition: ring.h:475
OrdNomogPosZero
@ OrdNomogPosZero
Definition: p_Procs_Impl.h:167
OrdPomog
@ OrdPomog
Definition: p_Procs_Impl.h:140
p_OrdIs
static p_Ord p_OrdIs(ring r)
Definition: p_Procs_Set.h:70
LengthThree
@ LengthThree
Definition: p_Procs_Impl.h:130
OrdNegPosNomog
@ OrdNegPosNomog
Definition: p_Procs_Impl.h:163
LengthSeven
@ LengthSeven
Definition: p_Procs_Impl.h:126
FieldZp_a
@ FieldZp_a
Definition: p_Procs_Impl.h:120
rField_is_R
static BOOLEAN rField_is_R(const ring r)
Definition: ring.h:509
SetProcs
#define SetProcs(field, length, ord)
Definition: p_Procs_Impl.h:662
p_Procs_s::pp_mm_Mult
pp_Mult_mm_Proc_Ptr pp_mm_Mult
Definition: p_Procs.h:49
p_Procs_s::pp_Mult_mm
pp_Mult_mm_Proc_Ptr pp_Mult_mm
Definition: p_Procs.h:48
LengthSix
@ LengthSix
Definition: p_Procs_Impl.h:127
OrdGeneral
@ OrdGeneral
Definition: p_Procs_Impl.h:137
p_Debug_GetProcNames
void p_Debug_GetProcNames(const ring r, p_Procs_s *p_Procs)
Definition: p_Procs_Set.h:213
p_Delete
static void p_Delete(poly *p, const ring r)
Definition: p_polys.h:858
p_Add_q
static poly p_Add_q(poly p, poly q, const ring r)
Definition: p_polys.h:893
rField_is_GF
static BOOLEAN rField_is_GF(const ring r)
Definition: ring.h:512
NV_MAX_PRIME
#define NV_MAX_PRIME
Definition: modulop.h:29
p_Length
p_Length
Definition: p_Procs_Impl.h:122
SetProcs_ring
#define SetProcs_ring(field, length, ord)
Definition: p_Procs_Impl.h:698
OrdNomogPos
@ OrdNomogPos
Definition: p_Procs_Impl.h:154
OrdPosPosNomog
@ OrdPosPosNomog
Definition: p_Procs_Impl.h:161
FieldR
@ FieldR
Definition: p_Procs_Impl.h:115
p_Procs_s::p_Mult_mm
p_Mult_mm_Proc_Ptr p_Mult_mm
Definition: p_Procs.h:51
assume
#define assume(x)
Definition: mod2.h:390
OrdPomogNeg
@ OrdPomogNeg
Definition: p_Procs_Impl.h:150
NULL
#define NULL
Definition: omList.c:10
OrdNomogZero
@ OrdNomogZero
Definition: p_Procs_Impl.h:146
OrdPosPosNomogZero
@ OrdPosPosNomogZero
Definition: p_Procs_Impl.h:170
l
int l
Definition: cfEzgcd.cc:93
pp_Mult_nn
static poly pp_Mult_nn(poly p, number n, const ring r)
Definition: p_polys.h:949
FieldGF
@ FieldGF
Definition: p_Procs_Impl.h:116
p
int p
Definition: cfModGcd.cc:4019
p_FieldEnum_2_String
static const char * p_FieldEnum_2_String(p_Field field)
Definition: p_Procs_Impl.h:198
RingGeneral
@ RingGeneral
Definition: p_Procs_Impl.h:123
rField_is_long_C
static BOOLEAN rField_is_long_C(const ring r)
Definition: ring.h:536
rField_is_Zp
static BOOLEAN rField_is_Zp(const ring r)
Definition: ring.h:491
_p_procs
static p_Procs_s * _p_procs
Definition: p_Procs_Set.h:113
p_Mult_nn
static poly p_Mult_nn(poly p, number n, const ring r)
Definition: p_polys.h:915
nc_p_ProcsSet
void nc_p_ProcsSet(ring rGR, p_Procs_s *p_Procs)
Definition: old.gring.cc:3205
FieldZp
@ FieldZp
Definition: p_Procs_Impl.h:113
sgn
int sgn(const Rational &a)
Definition: GMPrat.cc:433
nCoeff_is_Domain
static FORCE_INLINE BOOLEAN nCoeff_is_Domain(const coeffs r)
returns TRUE, if r is a field or r has no zero divisors (i.e is a domain)
Definition: coeffs.h:761
rField_is_Q
static BOOLEAN rField_is_Q(const ring r)
Definition: ring.h:497
FieldQ
@ FieldQ
Definition: p_Procs_Impl.h:114