source: git/Singular/p_Procs_Set.h @ 3b8515

fieker-DuValspielwiese
Last change on this file since 3b8515 was 50cbdc, checked in by Hans Schönemann <hannes@…>, 23 years ago
*hannes: merge-2-0-2 git-svn-id: file:///usr/local/Singular/svn/trunk@5619 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 5.5 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/***************************************************************
5 *  File:    p_ProcsSet.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.5 2001-08-27 14:47:29 Singular Exp $
15 *******************************************************************/
16
17// extract p_Procs properties from a ring
18static inline p_Field p_FieldIs(ring r)
19{
20  if (rField_is_Zp(r)) return FieldZp;
21  if (rField_is_R(r)) return FieldR;
22  if (rField_is_GF(r)) return FieldGF;
23  if (rField_is_Q(r)) return FieldQ;
24#ifdef HAVE_MORE_FIELDS_IMPLEMENTED
25  if (rField_is_long_R(r)) return FieldLong_R;
26  if (rField_is_long_C(r)) return FieldLong_C;
27  if (rField_is_Zp_a(r)) return FieldZp_a;
28  if (rField_is_Q_a(r)) return FieldQ_a;
29#endif
30  return FieldGeneral;
31}
32
33static inline p_Length p_LengthIs(ring r)
34{
35  assume(r->ExpL_Size > 0);
36  // here is a quick hack to take care of p_MemAddAdjust
37  if (r->NegWeightL_Offset != NULL) return LengthGeneral;
38  if (r->ExpL_Size == 1) return LengthOne;
39  if (r->ExpL_Size == 2) return LengthTwo;
40  if (r->ExpL_Size == 3) return LengthThree;
41  if (r->ExpL_Size == 4) return LengthFour;
42  if (r->ExpL_Size == 5) return LengthFive;
43  if (r->ExpL_Size == 6) return LengthSix;
44  if (r->ExpL_Size == 7) return LengthSeven;
45  if (r->ExpL_Size == 8) return LengthEight;
46  return LengthGeneral;
47}
48
49static inline int p_IsNomog(long* sgn, int l)
50{
51  int i;
52  for (i=0;i<l;i++)
53    if (sgn[i] > 0) return 0;
54
55  return 1;
56}
57
58static inline int p_IsPomog(long* sgn, int l)
59{
60  int i;
61  for (i=0;i<l;i++)
62    if (sgn[i] < 0) return 0;
63  return 1;
64}
65
66static inline p_Ord p_OrdIs(ring r)
67{
68  long* sgn = r->ordsgn;
69  long l = r->ExpL_Size;
70  int zero = 0;
71
72  if (sgn[l-1] == 0)
73  {
74    l--;
75    zero = 1;
76  }
77
78  // we always favour the pomog cases
79  if (p_IsPomog(sgn,l)) return (zero ? OrdPomogZero : OrdPomog);
80  if (p_IsNomog(sgn,l)) return (zero ? OrdNomogZero : OrdNomog);
81
82  assume(l > 1);
83
84  if (sgn[0] == -1 && p_IsPomog(&sgn[1], l-1))
85    return (zero ? OrdNegPomogZero : OrdNegPomog);
86  if (sgn[l-1] == -1 && p_IsPomog(sgn, l-1))
87    return (zero ? OrdPomogNegZero : OrdPomogNeg);
88
89  if (sgn[0] == 1 && p_IsNomog(&sgn[1], l-1))
90    return (zero ? OrdPosNomogZero : OrdPosNomog);
91  if (sgn[l-1] == 1 && p_IsNomog(sgn, l-1))
92    return (zero ? OrdNomogPosZero : OrdNomogPos);
93
94  assume(l > 2);
95
96  if (sgn[0] == 1 && sgn[1] == 1 && p_IsNomog(&sgn[2], l-2))
97    return (zero ? OrdPosPosNomogZero : OrdPosPosNomog);
98
99  if (sgn[0] == 1 && sgn[l-1] == 1 && p_IsNomog(&sgn[1], l-2))
100    return (zero ? OrdPosNomogPosZero : OrdPosNomogPos);
101
102  if (sgn[0] == -1 && sgn[1] == 1 && p_IsNomog(&sgn[2], l-2))
103    return (zero ? OrdNegPosNomogZero : OrdNegPosNomog);
104
105  return OrdGeneral;
106}
107
108// fields of this struct are set by DoSetProc
109static p_Procs_s *_p_procs;
110
111#ifdef RDEBUG
112// if set, then SetProcs sets only names, instead of functions
113static int set_names = 0;
114#endif
115
116#define CheckProc(which)                                    \
117do                                                          \
118{                                                           \
119  if (p_Procs->which == NULL)                               \
120  {                                                         \
121    dReportBug("p_Procs is NULL");                          \
122    Warn("Singular will work properly, but much slower");   \
123    p_Procs->which = (which##_Proc_Ptr)                     \
124      which##__FieldGeneral_LengthGeneral_OrdGeneral;       \
125  }                                                         \
126}                                                           \
127while (0)
128
129// Choose a set of p_Procs
130void p_ProcsSet(ring r, p_Procs_s* p_Procs)
131{
132  p_Field     field = p_FieldIs(r);
133  p_Length    length = p_LengthIs(r);
134  p_Ord       ord = p_OrdIs(r);
135
136  assume(p_Procs != NULL);
137//#ifdef RDEBUG
138  memset(p_Procs, 0, sizeof(p_Procs_s));
139//#endif
140  _p_procs = p_Procs;
141  assume(IsValidSpec(field, length, ord));
142
143  InitSetProcs(field, length, ord);
144  SetProcs(field, length, ord);
145  CheckProc(p_Copy);
146  CheckProc(p_Delete);
147  CheckProc(p_ShallowCopyDelete);
148  CheckProc(p_Mult_nn);
149  CheckProc(pp_Mult_nn);
150  CheckProc(pp_Mult_mm);
151  CheckProc(pp_Mult_mm_Noether);
152  CheckProc(p_Mult_mm);
153  CheckProc(p_Add_q);
154  CheckProc(p_Minus_mm_Mult_qq);
155  CheckProc(p_Neg);
156  CheckProc(pp_Mult_Coeff_mm_DivSelect);
157  CheckProc(pp_Mult_Coeff_mm_DivSelectMult);
158  CheckProc(p_Merge_q);
159  CheckProc(p_kBucketSetLm);
160
161/*
162  assume(p_Procs->pp_Mult_mm_Noether != pp_Mult_mm_Noether__FieldGeneral_LengthGeneral_OrdGeneral ||
163         p_Procs->p_Minus_mm_Mult_qq == p_Minus_mm_Mult_qq__FieldGeneral_LengthGeneral_OrdGeneral ||
164         r->OrdSgn == 1 || r->LexOrder);
165*/
166}
167
168#ifdef RDEBUG
169void p_Debug_GetSpecNames(const ring r, char* &field, char* &length, char* &ord)
170{
171  p_Field     e_field = p_FieldIs(r);
172  p_Length    e_length = p_LengthIs(r);
173  p_Ord       e_ord = p_OrdIs(r);
174
175  field  = p_FieldEnum_2_String(p_FieldIs(r));
176  length = p_LengthEnum_2_String(p_LengthIs(r));
177  ord    = p_OrdEnum_2_String(p_OrdIs(r));
178}
179
180void p_Debug_GetProcNames(const ring r, p_Procs_s* p_Procs)
181{
182  set_names = 1;
183  p_ProcsSet(r, p_Procs);
184  set_names = 0;
185}
186#endif // RDEBUG
Note: See TracBrowser for help on using the repository browser.