Macaulay2 Engine
Loading...
Searching...
No Matches
spair.cpp
Go to the documentation of this file.
1// Copyright 1996 Michael E. Stillman
2
3#include "spair.hpp"
4#include <iostream>
5
6// The following is constant
7
8static const int spair_heap_size[NHEAP] = {4,
9 16,
10 64,
11 256,
12 1024,
13 4048,
14 16384,
15 65536,
16 262144,
17 1048576,
18 16777216,
19 268435456};
20
22{
23 int i;
24 for (i = 0; i < NHEAP; i++)
25 {
26 heap[i] = nullptr;
27 n_in_heap[i] = 0;
28 }
29}
30
32{
33 s_pair head;
34 s_pair *inresult = &head;
35 for (int i = 0; i < NHEAP; i++)
36 if (heap[i])
37 {
38 inresult->next = heap[i];
39 while (inresult->next != nullptr) inresult = inresult->next;
40 }
41 return head.next;
42}
43
45{
46 // The user of this class must insure that all 's_pair's
47 // have been removed first. Thus, we don't need to
48 // do anything here.
49}
50#if 0
51// int s_pair_heap::compare(s_pair *f, s_pair *g) const
52// {
53// int cmp = f->degree - g->degree;
54// if (cmp < 0) return -1;
55// if (cmp > 0) return 1;
56// cmp = M->compare(f->lcm, g->lcm);
57// if (cmp != 0) return cmp;
58// if (f->first == NULL || g->first == NULL)
59// return 0;
60// cmp = f->first->me - g->first->me;
61// if (cmp > 0) return 1;
62// if (cmp < 0) return -1;
63// return 0;
64// }
65#endif
67{
68 int cmp = f->degree - g->degree;
69 if (cmp < 0) return -1;
70 if (cmp > 0) return 1;
71 int compare_type =
72 0; // MES: res-a2.cpp would change this globally, uugh. Doesn't seem to
73 // be used at all, so I am just commenting this out.
74 switch (compare_type)
75 {
76 case 0:
77 cmp = M->compare(f->lcm, g->lcm);
78 if (cmp != 0)
79 return cmp; // MES: changed cmp to -cmp, to try out different order
80 // 2/21/00.
81 if (f->first == nullptr || g->first == nullptr) return 0;
82 cmp = f->first->me - g->first->me;
83 if (cmp > 0) return 1;
84 if (cmp < 0) return -1;
85 break;
86 case 1:
87 cmp = M->compare(f->lcm, g->lcm);
88 if (cmp != 0)
89 return -cmp; // MES: changed cmp to -cmp, to try out different order
90 // 2/21/00.
91 if (f->first == nullptr || g->first == nullptr) return 0;
92 cmp = f->first->me - g->first->me;
93 if (cmp > 0) return 1;
94 if (cmp < 0) return -1;
95 break;
96 case 2:
97 if (f->first != nullptr && g->first != nullptr)
98 {
99 cmp = f->first->me - g->first->me;
100 if (cmp < 0) return -1;
101 if (cmp > 0) return 1;
102 }
103 if (f->second != nullptr && g->second != nullptr)
104 {
105 cmp = f->second->me - g->second->me;
106 if (cmp < 0) return -1;
107 if (cmp > 0) return 1;
108 }
109 cmp = M->compare(f->lcm, g->lcm);
110 if (cmp != 0) return cmp;
111 if (f->first == nullptr || g->first == nullptr) return 0;
112 cmp = f->first->me - g->first->me;
113 if (cmp > 0) return 1;
114 if (cmp < 0) return -1;
115 break;
116 default:
117 return -1;
118 break;
119 }
120 return 0;
121}
122
124{
125 // Sort in ascending degree order, then ascending monomial order
126 if (g == nullptr) return f;
127 if (f == nullptr) return g;
128 s_pair head;
129 s_pair *result = &head;
130 while (1) switch (compare(f, g))
131 {
132 case 1:
133 result->next = g;
134 result = result->next;
135 g = g->next;
136 if (g == nullptr)
137 {
138 result->next = f;
139 return head.next;
140 }
141 break;
142 case -1:
143 case 0:
144 result->next = f;
145 result = result->next;
146 f = f->next;
147 if (f == nullptr)
148 {
149 result->next = g;
150 return head.next;
151 }
152 break;
153 }
154}
155
157{
158 if (p == nullptr || p->next == nullptr) return;
159 s_pair *p1 = nullptr;
160 s_pair *p2 = nullptr;
161 while (p != nullptr)
162 {
163 s_pair *tmp = p;
164 p = p->next;
165 tmp->next = p1;
166 p1 = tmp;
167
168 if (p == nullptr) break;
169 tmp = p;
170 p = p->next;
171 tmp->next = p2;
172 p2 = tmp;
173 }
174
175 sort_list(p1);
176 sort_list(p2);
177 p = merge(p1, p2);
178}
179
181{
182 heap[0] = merge(p, heap[0]);
183 n_in_heap[0]++;
184 p = nullptr;
185 int i = 0;
186 while (n_in_heap[i] >= spair_heap_size[i])
187 {
188 i++;
189 if (i >= NHEAP)
190 {
191 std::cerr << "too many spairs: aborting" << std::endl;
192 std::cerr << "n_in_heap[" << i << "]=" << n_in_heap[i - 1]
193 << std::endl;
194 abort();
195 }
196 heap[i] = merge(heap[i - 1], heap[i]);
197 n_in_heap[i] += n_in_heap[i - 1];
198 heap[i - 1] = nullptr;
199 n_in_heap[i - 1] = 0;
200 }
201 if (i > top_of_heap) top_of_heap = i;
202 nelems++;
203}
204
206{
207 int i = 0;
208 while (len >= spair_heap_size[i]) i++;
209 heap[i] = merge(p, heap[i]);
210 n_in_heap[i] += len;
211 // std::cerr << "n_in_heap[" << i << "]=" << n_in_heap[i] << std::endl;
212 p = nullptr;
213 while (n_in_heap[i] >= spair_heap_size[i])
214 {
215 i++;
216 heap[i] = merge(heap[i - 1], heap[i]);
217 n_in_heap[i] += n_in_heap[i - 1];
218 heap[i - 1] = nullptr;
219 n_in_heap[i - 1] = 0;
220 }
221 if (i > top_of_heap) top_of_heap = i;
222 nelems += len;
223}
224
226{
227 // Find a non-zero element
228 if (nelems == 0) return nullptr;
229 int i, first;
230 for (first = 0; first <= top_of_heap; first++)
231 if (n_in_heap[first] > 0) break;
232
233 s_pair *smallest = heap[first];
234 // Now find the smallest one
235 for (i = first + 1; i <= top_of_heap; i++)
236 {
237 if (heap[i] == nullptr) continue;
238 int cmp = compare(smallest, heap[i]);
239 if (cmp > 0)
240 {
241 first = i;
242 smallest = heap[first];
243 }
244 }
245
246 // Now remove this element and return it:
247 heap[first] = smallest->next;
248 smallest->next = nullptr;
249 nelems--;
250
251 n_in_heap[first]--;
252 if (n_in_heap[top_of_heap] == 0)
253 for (i = top_of_heap - 1; i >= 0; i--)
254 if (n_in_heap[i] > 0)
255 {
256 top_of_heap = i;
257 break;
258 }
259
260 return smallest;
261}
262
264{
265 insert(p);
266 p = nullptr;
267}
268
269void s_pair_heap::stats() const {}
271{
272 (void) o;
273#ifdef DEVELOPMENT
274#warning "should we display anything in spair text_out, stats?"
275#endif
276}
277
278// Local Variables:
279// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
280// indent-tabs-mode: nil
281// End:
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
Definition monoid.hpp:89
void stats() const
Definition spair.cpp:269
s_pair * remove()
Definition spair.cpp:225
void sort_list(s_pair *&p) const
Definition spair.cpp:156
s_pair_heap(const Monoid *M)
Definition spair.cpp:21
s_pair * heap[NHEAP]
Definition spair.hpp:108
int n_in_heap[NHEAP]
Definition spair.hpp:109
int compare(s_pair *f, s_pair *g) const
Definition spair.cpp:66
s_pair * merge(s_pair *f, s_pair *g) const
Definition spair.cpp:123
s_pair * grab_remaining_pairs()
Definition spair.cpp:31
void text_out(buffer &o) const
Definition spair.cpp:270
void put_back(s_pair *&p)
Definition spair.cpp:263
int top_of_heap
Definition spair.hpp:110
~s_pair_heap()
Definition spair.cpp:44
const Monoid * M
Definition spair.hpp:106
void insert(s_pair *&p)
Definition spair.cpp:180
int p
int p1
VALGRIND_MAKE_MEM_DEFINED & result(result)
static const int spair_heap_size[NHEAP]
Definition spair.cpp:8
const int NHEAP
Definition spair.hpp:102
gb_elem / s_pair / s_pair_heap — basis-element record, S-pair work unit, and S-pair priority queue fo...
int me
Definition spair.hpp:62
int * lcm
Definition spair.hpp:95
int degree
Definition spair.hpp:94
gb_elem * second
Definition spair.hpp:97
s_pair * next
Definition spair.hpp:90
gb_elem * first
Definition spair.hpp:96