Macaulay2 Engine
Loading...
Searching...
No Matches
janettree.hpp
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright (C) 2006-2011 by Mikhail V. Zinin *
3 * mzinin@gmail.com *
4 * *
5 * You may redistribute this file under the terms of the GNU General *
6 * Public License as published by the Free Software Foundation, either *
7 * version 2 of the License, or any later version. *
8 *****************************************************************************/
9
10#ifndef BIBASIS_JANETTREE_HPP
11#define BIBASIS_JANETTREE_HPP
12
42
43#include "triple.hpp"
44
45namespace BIBasis
46{
47 template <typename MonomType>
48 class JanetTree
49 {
50 private:
51 struct Node
52 {
53 typename MonomType::Integer Degree;
57
58 Node(typename MonomType::Integer degree);
59 ~Node();
60 };
61
63 {
64 private:
66
67 public:
68 ConstIterator(Node* node);
70
71 void StepNextDegree();
72 void StepNextVariable();
73 operator bool() const;
76 bool HasNextDegree() const;
77 bool HasNextVariable() const;
78 const Triple<MonomType>* GetTriple() const;
79 typename MonomType::Integer GetDegree() const;
80 };
81
82 class Iterator
83 {
84 private:
86
87 public:
88 Iterator(Node* &node);
89 ~Iterator();
90
91 void StepNextDegree();
92 void StepNextVariable();
93 operator bool() const;
96 bool HasNextDegree() const;
97 bool HasNextVariable() const;
98 operator ConstIterator() const;
100 typename MonomType::Integer GetDegree() const;
101 void Build(typename MonomType::Integer degree, typename MonomType::Integer var, Triple<MonomType>* triple);
102 void Delete();
103 void Exclude();
104 void Clear();
105 };
106
108
109 public:
110 JanetTree();
111 ~JanetTree();
112
113 const Triple<MonomType>* Find(const MonomType& monom) const;
114 void Insert(Triple<MonomType>* triple);
115 void Delete(const Triple<MonomType>* triple);
116 void Clear();
117
118 std::set<typename MonomType::Integer> NonMulti(const Triple<MonomType>* triple) const;
119 };
120
121 template <typename MonomType>
122 JanetTree<MonomType>::Node::Node(typename MonomType::Integer degree)
123 : Degree(degree)
124 , CurrentTriple(0)
125 , NextDegree(0)
126 , NextVariable(0)
127 {
128 }
129
130 template <typename MonomType>
134
135 template <typename MonomType>
140
141 template <typename MonomType>
145
146 template <typename MonomType>
151
152 template <typename MonomType>
157
158 template <typename MonomType>
163
164 template <typename MonomType>
169
170 template <typename MonomType>
175
176 template <typename MonomType>
178 {
179 return CurrentNode->NextDegree;
180 }
181
182 template <typename MonomType>
184 {
185 return CurrentNode->NextVariable;
186 }
187
188 template <typename MonomType>
190 {
191 return CurrentNode->CurrentTriple;
192 }
193
194 template <typename MonomType>
195 typename MonomType::Integer JanetTree<MonomType>::ConstIterator::GetDegree() const
196 {
197 return CurrentNode->Degree;
198 }
199
200 template <typename MonomType>
205
206 template <typename MonomType>
210
211 template <typename MonomType>
213 {
214 CurrentNode = &(*CurrentNode)->NextDegree;
215 }
216
217 template <typename MonomType>
219 {
220 CurrentNode = &(*CurrentNode)->NextVariable;
221 }
222
223 template <typename MonomType>
228
229 template <typename MonomType>
231 {
232 return (*CurrentNode)->NextDegree;
233 }
234
235 template <typename MonomType>
237 {
238 return (*CurrentNode)->NextVariable;
239 }
240
241 template <typename MonomType>
243 {
244 return (*CurrentNode)->NextDegree;
245 }
246
247 template <typename MonomType>
249 {
250 return (*CurrentNode)->NextVariable;
251 }
252
253 template <typename MonomType>
255 {
256 return *CurrentNode;
257 }
258
259 template <typename MonomType>
261 {
262 return (*CurrentNode)->CurrentTriple;
263 }
264
265 template <typename MonomType>
266 typename MonomType::Integer JanetTree<MonomType>::Iterator::GetDegree() const
267 {
268 return (*CurrentNode)->Degree;
269 }
270
271 template <typename MonomType>
272 void JanetTree<MonomType>::Iterator::Build(typename MonomType::Integer degree, typename MonomType::Integer var, Triple<MonomType>* triple)
273 {
274 if (!triple)
275 {
276 return;
277 }
278
279 Node* r = new typename JanetTree<MonomType>::Node(triple->GetPolynomLm()[var]);
280 Node* j = r;
281 while(degree > triple->GetPolynomLm()[var])
282 {
283 degree -= triple->GetPolynomLm()[var];
284 ++var;
285 j->NextVariable = new typename JanetTree<MonomType>::Node(triple->GetPolynomLm()[var]);
286 j = j->NextVariable;
287 }
288 j->CurrentTriple = triple;
289
291 *CurrentNode = r;
292 }
293
294 template <typename MonomType>
296 {
297 if (*CurrentNode)
298 {
299 Node* tmp = *CurrentNode;
300 *CurrentNode = tmp->NextDegree;
301 delete tmp;
302 }
303 }
304
305 template <typename MonomType>
307 {
308 while (HasNextDegree())
309 {
310 if ((*CurrentNode)->NextVariable)
311 {
312 typename JanetTree<MonomType>::Iterator((*CurrentNode)->NextVariable).Clear();
313 }
314 Delete();
315 }
316 Delete();
317 }
318
319 template <typename MonomType>
321 : Root(0)
322 {
323 }
324
325 template <typename MonomType>
327 {
328 Clear();
329 delete Root;
330 }
331
332 template <typename MonomType>
333 const Triple<MonomType>* JanetTree<MonomType>::Find(const MonomType& monom) const
334 {
335 const Triple<MonomType>* triple = 0;
336
337 if (Root)
338 {
339 ConstIterator nodeIterator = Root;
340 typename MonomType::Integer degree = monom.Degree();
341 typename MonomType::Integer var = 0;
342 do
343 {
344 if (nodeIterator.GetDegree() != monom[var] && nodeIterator.HasNextDegree())
345 {
346 nodeIterator.StepNextDegree();
347 }
348
349 if (nodeIterator.GetDegree() != monom[var])
350 {
351 break;
352 }
353 else if (nodeIterator.HasNextVariable())
354 {
355 degree -= monom[var];
356 if (!degree)
357 {
358 break;
359 }
360 ++var;
361 nodeIterator.StepNextVariable();
362 }
363 else
364 {
365 triple = nodeIterator.GetTriple();
366 break;
367 }
368 } while(true);
369 }
370 return triple;
371 }
372
373 template <typename MonomType>
375 {
376 if (!triple)
377 {
378 return;
379 }
380
381 typename MonomType::Integer degree = triple->GetPolynomLm().Degree();
382 typename JanetTree<MonomType>::Iterator nodeIterator(Root);
383
384 if (!Root)
385 {
386 nodeIterator.Build(degree, 0, triple);
387 }
388 else
389 {
390 typename MonomType::Integer var = 0;
391 do
392 {
393 while(nodeIterator.GetDegree() < triple->GetPolynomLm()[var] && nodeIterator.HasNextDegree())
394 {
395 nodeIterator.StepNextDegree();
396 }
397
398 if (nodeIterator.GetDegree() > triple->GetPolynomLm()[var])
399 {
400 nodeIterator.Build(degree, var, triple);
401 break;
402 }
403 else if (nodeIterator.GetDegree() == triple->GetPolynomLm()[var])
404 {
405 degree -= triple->GetPolynomLm()[var];
406 ++var;
407 nodeIterator.StepNextVariable();
408 }
409 else
410 {
411 nodeIterator.StepNextDegree();
412 nodeIterator.Build(degree, var, triple);
413 break;
414 }
415 } while(true);
416 }
417 }
418
419 template <typename MonomType>
421 {
422 if (!triple)
423 {
424 return;
425 }
426
427 Iterator nodeIterator = Root;
428 //count bifurcations
429 typename MonomType::Integer var = 0;
430 unsigned bifurcations = 0;
431
432 if (nodeIterator.HasNextDegree() && nodeIterator.HasNextVariable())
433 {
434 ++bifurcations;
435 }
436
437 do
438 {
439 while(nodeIterator.GetDegree() < triple->GetPolynomLm()[var])
440 {
441 nodeIterator.StepNextDegree();
442 if (nodeIterator.HasNextDegree() && nodeIterator.HasNextVariable())
443 {
444 ++bifurcations;
445 }
446 }
447
448 if (nodeIterator.HasNextVariable())
449 {
450 ++var;
451 nodeIterator.StepNextVariable();
452 if (nodeIterator.HasNextDegree() && nodeIterator.HasNextVariable())
453 {
454 ++bifurcations;
455 }
456 }
457 else
458 {
459 break;
460 }
461 } while(true);
462
463 //deletion
464 nodeIterator = Root;
465 var = 0;
466 bool varDirection = false;
467
468 if (nodeIterator.HasNextDegree() && nodeIterator.HasNextVariable())
469 {
470 --bifurcations;
471 }
472 if (!bifurcations)
473 {
474 if (nodeIterator.GetDegree() < triple->GetPolynomLm()[var])
475 {
476 nodeIterator.StepNextDegree();
477 }
478 else
479 {
480 varDirection = true;
481 }
482 }
483
484 while (bifurcations > 0)
485 {
486 while(nodeIterator.GetDegree() < triple->GetPolynomLm()[var] && bifurcations > 0)
487 {
488 nodeIterator.StepNextDegree();
489 if (nodeIterator.HasNextDegree() && nodeIterator.HasNextVariable())
490 {
491 --bifurcations;
492 }
493 }
494
495 if (!bifurcations)
496 {
497 if (nodeIterator.GetDegree() < triple->GetPolynomLm()[var])
498 {
499 nodeIterator.StepNextDegree();
500 break;
501 }
502 else
503 {
504 varDirection = true;
505 break;
506 }
507 }
508
509 ++var;
510 nodeIterator.StepNextVariable();
511 if (nodeIterator.HasNextDegree() && nodeIterator.HasNextVariable())
512 {
513 --bifurcations;
514 }
515 if (!bifurcations)
516 {
517 if (nodeIterator.GetDegree() < triple->GetPolynomLm()[var])
518 {
519 nodeIterator.StepNextDegree();
520 break;
521 }
522 else
523 {
524 varDirection = true;
525 break;
526 }
527 }
528 }
529
530 if (varDirection)
531 {
532 Iterator tmpIterator = nodeIterator;
533 tmpIterator.StepNextVariable();
534 tmpIterator.Clear();
535 nodeIterator.Delete();
536 }
537 else
538 {
539 nodeIterator.Clear();
540 }
541 }
542
543 template <typename MonomType>
545 {
546 if (Root)
547 {
548 typename JanetTree<MonomType>::Iterator nodeIterator(Root);
549 nodeIterator.Clear();
550 }
551 }
552
553 template <typename MonomType>
554 std::set<typename MonomType::Integer> JanetTree<MonomType>::NonMulti(const Triple<MonomType>* triple) const
555 {
556 std::set<typename MonomType::Integer> result;
557
558 if (triple && Root)
559 {
560 ConstIterator nodeIterator(Root);
561 typename MonomType::Integer var = 0;
562 do
563 {
564 while (nodeIterator.GetDegree() < triple->GetPolynomLm()[var])
565 {
566 nodeIterator.StepNextDegree();
567 }
568 if (nodeIterator.HasNextDegree())
569 {
570 result.insert(var);
571 }
572
573 ++var;
574 if (nodeIterator.HasNextVariable())
575 {
576 nodeIterator.StepNextVariable();
577 }
578 else
579 {
580 break;
581 }
582 } while(true);
583 }
584
585 return result;
586 }
587}
588
589#endif // BIBASIS_JANETTREE_HPP
ConstIterator GetNextDegree() const
MonomType::Integer GetDegree() const
ConstIterator GetNextVariable() const
const Triple< MonomType > * GetTriple() const
ConstIterator GetNextVariable() const
ConstIterator GetNextDegree() const
void Build(typename MonomType::Integer degree, typename MonomType::Integer var, Triple< MonomType > *triple)
MonomType::Integer GetDegree() const
Triple< MonomType > *& GetTriple() const
void Insert(Triple< MonomType > *triple)
const Triple< MonomType > * Find(const MonomType &monom) const
void Delete(const Triple< MonomType > *triple)
std::set< typename MonomType::Integer > NonMulti(const Triple< MonomType > *triple) const
const MonomType & GetPolynomLm() const
Definition triple.hpp:161
VALGRIND_MAKE_MEM_DEFINED & result(result)
tbb::flow::continue_node< tbb::flow::continue_msg > Node
Triple< MonomType > * CurrentTriple
Definition janettree.hpp:54
Node(typename MonomType::Integer degree)
MonomType::Integer Degree
Definition janettree.hpp:53
BIBasis::Triple<MonomType> — (polynomial, ancestors, non-multiplicative variables) record driving Jan...