source: git/kernel/p_Procs_Set.h @ 5aec73

spielwiese
Last change on this file since 5aec73 was 5aec73, checked in by Hans Schönemann <hannes@…>, 17 years ago
*hannes: fix git-svn-id: file:///usr/local/Singular/svn/trunk@9721 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 6.0 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 *  Version: $Id: p_Procs_Set.h,v 1.11 2007-01-15 17:13:59 Singular Exp $
15 *******************************************************************/
16#include "modulop.h"
17
18#include "sca.h"
19
20
21// extract p_Procs properties from a ring
22static inline p_Field p_FieldIs(ring r)
23{
24  if (rField_is_Zp(r))
25    return FieldZp;
26  if (rField_is_R(r)) return FieldR;
27  if (rField_is_GF(r)) return FieldGF;
28  if (rField_is_Q(r)) return FieldQ;
29#ifdef HAVE_MORE_FIELDS_IMPLEMENTED
30  if (rField_is_long_R(r)) return FieldLong_R;
31  if (rField_is_long_C(r)) return FieldLong_C;
32  if (rField_is_Zp_a(r)) return FieldZp_a;
33  if (rField_is_Q_a(r)) return FieldQ_a;
34#endif
35  return FieldGeneral;
36}
37
38static 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
54static 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
63static 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
71static 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
114static p_Procs_s *_p_procs;
115
116#ifdef RDEBUG
117// if set, then SetProcs sets only names, instead of functions
118static int set_names = 0;
119#endif
120
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    p_Procs->which = (which##_Proc_Ptr)                     \
129      which##__FieldGeneral_LengthGeneral_OrdGeneral;       \
130  }                                                         \
131}                                                           \
132while (0);
133
134// Choose a set of p_Procs
135void p_ProcsSet(ring r, p_Procs_s* p_Procs)
136{
137  p_Field     field = p_FieldIs(r);
138  p_Length    length = p_LengthIs(r);
139  p_Ord       ord = p_OrdIs(r);
140
141  assume(p_Procs != NULL);
142  memset(p_Procs, 0, sizeof(p_Procs_s));
143  _p_procs = p_Procs;
144  assume(IsValidSpec(field, length, ord));
145
146  InitSetProcs(field, length, ord);
147  SetProcs(field, length, ord);
148  #ifdef NV_OPS
149  if ((field==FieldZp) && (r->ch>NV_MAX_PRIME))
150  {
151    // set all (mult/div.) routines to FieldGeneral-variants
152    SetProcs(FieldGeneral, length,ord); // p_Mult_nn, ...
153    // set all non-mult/div. routines to FieldZp-variants
154    SetProcs_nv(FieldZp, length,ord); // p_Delete, p_ShallowCopyDelete...
155  }
156  #endif 
157  CheckProc(p_Copy);
158  CheckProc(p_Delete);
159  CheckProc(p_ShallowCopyDelete);
160  CheckProc(p_Mult_nn);
161  CheckProc(pp_Mult_nn);
162  CheckProc(pp_Mult_mm);
163  CheckProc(p_Mult_mm);
164  CheckProc(p_Minus_mm_Mult_qq);
165  CheckProc(pp_Mult_mm_Noether);
166  CheckProc(p_Add_q);
167  CheckProc(p_Neg);
168  CheckProc(pp_Mult_Coeff_mm_DivSelect);
169  CheckProc(pp_Mult_Coeff_mm_DivSelectMult);
170  CheckProc(p_Merge_q);
171  CheckProc(p_kBucketSetLm);
172
173/*
174  assume(p_Procs->pp_Mult_mm_Noether != pp_Mult_mm_Noether__FieldGeneral_LengthGeneral_OrdGeneral ||
175         p_Procs->p_Minus_mm_Mult_qq == p_Minus_mm_Mult_qq__FieldGeneral_LengthGeneral_OrdGeneral ||
176         r->OrdSgn == 1 || r->LexOrder);
177*/
178  #ifdef HAVE_PLURAL
179  if (rIsPluralRing(r))
180  {
181    SetProcsGNC(r, _p_procs);
182
183    if(rIsSCA(r))
184    {
185      SetProcsSCA(r, _p_procs);
186    }
187  }
188  #endif
189}
190
191#ifdef RDEBUG
192void p_Debug_GetSpecNames(const ring r, char* &field, char* &length, char* &ord)
193{
194  p_Field     e_field = p_FieldIs(r);
195  p_Length    e_length = p_LengthIs(r);
196  p_Ord       e_ord = p_OrdIs(r);
197
198  field  = p_FieldEnum_2_String(p_FieldIs(r));
199  length = p_LengthEnum_2_String(p_LengthIs(r));
200  ord    = p_OrdEnum_2_String(p_OrdIs(r));
201}
202
203void p_Debug_GetProcNames(const ring r, p_Procs_s* p_Procs)
204{
205  set_names = 1;
206  p_ProcsSet(r, p_Procs);
207  set_names = 0;
208}
209#endif // RDEBUG
Note: See TracBrowser for help on using the repository browser.