source: git/libpolys/polys/templates/p_Procs_Set.h @ 4fc9cc

spielwiese
Last change on this file since 4fc9cc was 4fc9cc, checked in by Hans Schoenemann <hannes@…>, 6 years ago
chg: move pp_mm_Mult to pProcs out of plural stuff
  • Property mode set to 100644
File size: 6.6 KB
Line 
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
20static 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
37static 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
53static 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
62static 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
70static 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
113static p_Procs_s *_p_procs;
114
115#ifdef RDEBUG
116// if set, then SetProcs sets only names, instead of functions
117static int set_names = 0;
118#endif
119
120// (which##_Proc_Ptr)F ->-> cast_vptr_to_A<which##_Proc_Ptr>(F)?
121#define CheckProc(which)                                    \
122do                                                          \
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}                                                           \
133while (0);
134
135void nc_p_ProcsSet(ring rGR, p_Procs_s* p_Procs);
136
137// Choose a set of p_Procs
138void p_ProcsSet(ring r, p_Procs_s* p_Procs)
139{
140  p_Field     field = p_FieldIs(r);
141  p_Length    length = p_LengthIs(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))
161      SetProcs_ring(FieldGeneral,length,ord);
162      // FieldGeneral vs. RingGeneral: HAVE_ZERODIVISORS
163    else
164      SetProcs_ring(RingGeneral,length,ord);
165  }
166  #endif
167  _p_procs->p_mm_Mult=_p_procs->p_Mult_mm;
168  _p_procs->pp_mm_Mult=_p_procs->pp_Mult_mm;
169  CheckProc(p_Copy);
170  CheckProc(p_Delete);
171  CheckProc(p_ShallowCopyDelete);
172  CheckProc(p_Mult_nn);
173  CheckProc(pp_Mult_nn);
174  CheckProc(pp_Mult_mm);
175  CheckProc(p_Mult_mm);
176  CheckProc(p_Minus_mm_Mult_qq);
177  CheckProc(pp_Mult_mm_Noether);
178  CheckProc(p_Add_q);
179  CheckProc(p_Neg);
180  CheckProc(pp_Mult_Coeff_mm_DivSelect);
181  CheckProc(pp_Mult_Coeff_mm_DivSelectMult);
182  CheckProc(p_Merge_q);
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
202void 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));
209  length = p_LengthEnum_2_String(p_LengthIs(r));
210  ord    = p_OrdEnum_2_String(p_OrdIs(r));
211}
212
213void 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
Note: See TracBrowser for help on using the repository browser.