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 
18 // extract p_Procs properties from a ring
19 static inline p_Field p_FieldIs(ring r)
20 {
21  if (rField_is_Zp(r))
22  return FieldZp;
23  if (rField_is_R(r)) return FieldR;
24  if (rField_is_GF(r)) return FieldGF;
25  if (rField_is_Q(r)) return FieldQ;
26 #ifdef HAVE_MORE_FIELDS_IMPLEMENTED
27  if (rField_is_long_R(r)) return FieldLong_R;
28  if (rField_is_long_C(r)) return FieldLong_C;
29  if (rField_is_Zp_a(r)) return FieldZp_a;
30  if (rField_is_Q_a(r)) return FieldQ_a;
31 #endif
32 #ifdef HAVE_RINGS
33  if (rField_is_Ring(r)) return RingGeneral;
34 #endif
35  return FieldGeneral;
36 }
37 
38 static inline p_Length p_LengthIs(ring r)
39 {
40  assume(r->ExpL_Size > 0);
41  // here is a quick hack to take care of p_MemAddAdjust
42  if (r->NegWeightL_Offset != NULL) return LengthGeneral;
43  if (r->ExpL_Size == 1) return LengthOne;
44  if (r->ExpL_Size == 2) return LengthTwo;
45  if (r->ExpL_Size == 3) return LengthThree;
46  if (r->ExpL_Size == 4) return LengthFour;
47  if (r->ExpL_Size == 5) return LengthFive;
48  if (r->ExpL_Size == 6) return LengthSix;
49  if (r->ExpL_Size == 7) return LengthSeven;
50  if (r->ExpL_Size == 8) return LengthEight;
51  return LengthGeneral;
52 }
53 
54 static inline int p_IsNomog(long* sgn, int l)
55 {
56  int i;
57  for (i=0;i<l;i++)
58  if (sgn[i] > 0) return 0;
59 
60  return 1;
61 }
62 
63 static inline int p_IsPomog(long* sgn, int l)
64 {
65  int i;
66  for (i=0;i<l;i++)
67  if (sgn[i] < 0) return 0;
68  return 1;
69 }
70 
71 static inline p_Ord p_OrdIs(ring r)
72 {
73  long* sgn = r->ordsgn;
74  long l = r->ExpL_Size;
75  int zero = 0;
76 
77  if (sgn[l-1] == 0)
78  {
79  l--;
80  zero = 1;
81  }
82 
83  // we always favour the pomog cases
84  if (p_IsPomog(sgn,l)) return (zero ? OrdPomogZero : OrdPomog);
85  if (p_IsNomog(sgn,l)) return (zero ? OrdNomogZero : OrdNomog);
86 
87  assume(l > 1);
88 
89  if (sgn[0] == -1 && p_IsPomog(&sgn[1], l-1))
90  return (zero ? OrdNegPomogZero : OrdNegPomog);
91  if (sgn[l-1] == -1 && p_IsPomog(sgn, l-1))
92  return (zero ? OrdPomogNegZero : OrdPomogNeg);
93 
94  if (sgn[0] == 1 && p_IsNomog(&sgn[1], l-1))
95  return (zero ? OrdPosNomogZero : OrdPosNomog);
96  if (sgn[l-1] == 1 && p_IsNomog(sgn, l-1))
97  return (zero ? OrdNomogPosZero : OrdNomogPos);
98 
99  assume(l > 2);
100 
101  if (sgn[0] == 1 && sgn[1] == 1 && p_IsNomog(&sgn[2], l-2))
102  return (zero ? OrdPosPosNomogZero : OrdPosPosNomog);
103 
104  if (sgn[0] == 1 && sgn[l-1] == 1 && p_IsNomog(&sgn[1], l-2))
105  return (zero ? OrdPosNomogPosZero : OrdPosNomogPos);
106 
107  if (sgn[0] == -1 && sgn[1] == 1 && p_IsNomog(&sgn[2], l-2))
108  return (zero ? OrdNegPosNomogZero : OrdNegPosNomog);
109 
110  return OrdGeneral;
111 }
112 
113 // fields of this struct are set by DoSetProc
115 
116 #ifdef RDEBUG
117 // if set, then SetProcs sets only names, instead of functions
118 static int set_names = 0;
119 #endif
120 
121 // (which##_Proc_Ptr)F ->-> cast_vptr_to_A<which##_Proc_Ptr>(F)?
122 #define CheckProc(which) \
123 do \
124 { \
125  if (p_Procs->which == NULL) \
126  { \
127  dReportBug("p_Procs is NULL"); \
128  WarnS("Singular will work properly, but much slower"); \
129  WarnS("If you chose a coef ring, it may not work at all");\
130  p_Procs->which = (which##_Proc_Ptr)( \
131  which##__FieldGeneral_LengthGeneral_OrdGeneral); \
132  } \
133 } \
134 while (0);
135 
136 void nc_p_ProcsSet(ring rGR, p_Procs_s* p_Procs);
137 
138 // Choose a set of p_Procs
139 void p_ProcsSet(ring r, p_Procs_s* p_Procs)
140 {
141  p_Field field = p_FieldIs(r);
142  p_Length length = p_LengthIs(r);
143  p_Ord ord = p_OrdIs(r);
144 
145  assume(p_Procs != NULL);
146  memset(p_Procs, 0, sizeof(p_Procs_s));
147  _p_procs = p_Procs;
148  assume(IsValidSpec(field, length, ord));
149 
150  SetProcs(field, length, ord);
151  extern poly p_Mult_nn_pthread(poly p, const number n, const ring r);
152  #ifdef NV_OPS
153  if ((field==FieldZp) && (r->cf->ch>NV_MAX_PRIME))
154  {
155  // set all (mult/div.) routines to FieldGeneral-variants
156  SetProcs(FieldGeneral, length,ord); // p_Mult_nn, ...
157  // set all non-mult/div. routines to FieldZp-variants
158  SetProcs_nv(FieldZp, length,ord); // p_Delete, p_ShallowCopyDelete...
159  }
160  #endif
161  CheckProc(p_Copy);
169  CheckProc(pp_Mult_mm_Noether);
171  CheckProc(p_Neg);
173  CheckProc(pp_Mult_Coeff_mm_DivSelectMult);
175  CheckProc(p_kBucketSetLm);
176 
177 /*
178  assume(p_Procs->pp_Mult_mm_Noether != pp_Mult_mm_Noether__FieldGeneral_LengthGeneral_OrdGeneral ||
179  p_Procs->p_Minus_mm_Mult_qq == p_Minus_mm_Mult_qq__FieldGeneral_LengthGeneral_OrdGeneral ||
180  r->OrdSgn == 1 || r->LexOrder);
181 */
182 #ifdef HAVE_PLURAL
183 #ifndef SING_NDEBUG
184  if (rIsPluralRing(r))
185  {
186  dReportError("Setting pProcs in p_ProcsSet (rDebugPrint!?)!!!");
187  nc_p_ProcsSet(r, _p_procs); // Setup non-commutative p_Procs table!
188  }
189 #endif
190 #endif
191 }
192 
193 #ifdef RDEBUG
194 void p_Debug_GetSpecNames(const ring r, const char* &field, const char* &length, const char* &ord)
195 {
196  /*p_Field e_field =*/ (void) p_FieldIs(r);
197  /*p_Length e_length =*/ (void) p_LengthIs(r);
198  /*p_Ord e_ord =*/ (void) p_OrdIs(r);
199 
200  field = p_FieldEnum_2_String(p_FieldIs(r));
201  length = p_LengthEnum_2_String(p_LengthIs(r));
202  ord = p_OrdEnum_2_String(p_OrdIs(r));
203 }
204 
205 void p_Debug_GetProcNames(const ring r, p_Procs_s* p_Procs)
206 {
207  set_names = 1;
208  p_ProcsSet(r, p_Procs); // changes p_Procs!!!
209  set_names = 0;
210 }
211 #endif // RDEBUG
void p_ProcsSet(ring r, p_Procs_s *p_Procs)
Definition: p_Procs_Set.h:139
static int p_IsNomog(long *sgn, int l)
Definition: p_Procs_Set.h:54
static p_Field p_FieldIs(ring r)
Definition: p_Procs_Set.h:19
static int p_IsPomog(long *sgn, int l)
Definition: p_Procs_Set.h:63
static BOOLEAN rField_is_Zp_a(const ring r)
Definition: ring.h:478
int sgn(const Rational &a)
Definition: GMPrat.cc:437
return P p
Definition: myNF.cc:203
static poly p_Mult_mm(poly p, poly m, const ring r)
Definition: p_polys.h:973
struct p_Procs_s p_Procs_s
Definition: ring.h:29
static BOOLEAN rField_is_R(const ring r)
Definition: ring.h:467
#define SetProcs(field, length, ord)
Definition: p_Procs_Impl.h:667
static int set_names
Definition: p_Procs_Set.h:118
static poly pp_Mult_nn(poly p, number n, const ring r)
Definition: p_polys.h:927
const CanonicalForm CFMap CFMap int &both_non_zero int n
Definition: cfEzgcd.cc:52
void p_Debug_GetSpecNames(const ring r, const char *&field, const char *&length, const char *&ord)
Definition: p_Procs_Set.h:194
static const char * p_OrdEnum_2_String(p_Ord ord)
Definition: p_Procs_Impl.h:244
static BOOLEAN rField_is_Q_a(const ring r)
Definition: ring.h:488
static poly pp_Mult_mm(poly p, poly m, const ring r)
Definition: p_polys.h:962
#define CheckProc(which)
Definition: p_Procs_Set.h:122
static p_Length p_LengthIs(ring r)
Definition: p_Procs_Set.h:38
static BOOLEAN rField_is_GF(const ring r)
Definition: ring.h:470
static bool rIsPluralRing(const ring r)
we must always have this test!
Definition: ring.h:361
static p_Ord p_OrdIs(ring r)
Definition: p_Procs_Set.h:71
static poly p_Copy(poly p, const ring r)
returns a copy of p
Definition: p_polys.h:811
p_Length
Definition: p_Procs_Impl.h:127
const ring r
Definition: syzextra.cc:208
#define assume(x)
Definition: mod2.h:405
p_Field
Definition: p_Procs_Impl.h:109
static poly p_ShallowCopyDelete(poly p, const ring r, omBin bin)
Definition: p_polys.h:876
int i
Definition: cfEzgcd.cc:123
static poly p_Mult_nn(poly p, number n, const ring r)
Definition: p_polys.h:902
static BOOLEAN rField_is_Q(const ring r)
Definition: ring.h:461
void p_Debug_GetProcNames(const ring r, p_Procs_s *p_Procs)
Definition: p_Procs_Set.h:205
static int IsValidSpec(p_Field field, p_Length length, p_Ord ord)
Definition: p_Procs_Impl.h:573
static BOOLEAN rField_is_long_C(const ring r)
Definition: ring.h:494
#define NV_MAX_PRIME
Definition: modulop.h:21
static BOOLEAN rField_is_Zp(const ring r)
Definition: ring.h:455
static const char * p_LengthEnum_2_String(p_Length length)
Definition: p_Procs_Impl.h:226
static void p_Delete(poly *p, const ring r)
Definition: p_polys.h:850
p_Ord
Definition: p_Procs_Impl.h:140
static BOOLEAN rField_is_Ring(const ring r)
Definition: ring.h:437
#define NULL
Definition: omList.c:10
static poly p_Merge_q(poly p, poly q, const ring r)
Definition: p_polys.h:1140
static BOOLEAN rField_is_long_R(const ring r)
Definition: ring.h:491
static p_Procs_s * _p_procs
Definition: p_Procs_Set.h:114
void nc_p_ProcsSet(ring rGR, p_Procs_s *p_Procs)
Definition: old.gring.cc:3264
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:981
int dReportError(const char *fmt,...)
Definition: dError.cc:45
static poly p_Neg(poly p, const ring r)
Definition: p_polys.h:1018
polyrec * poly
Definition: hilb.h:10
static poly p_Add_q(poly p, poly q, const ring r)
Definition: p_polys.h:884
static poly pp_Mult_Coeff_mm_DivSelect(poly p, const poly m, const ring r)
Definition: p_polys.h:1001
int l
Definition: cfEzgcd.cc:94
static const char * p_FieldEnum_2_String(p_Field field)
Definition: p_Procs_Impl.h:203