Macaulay2 Engine
Loading...
Searching...
No Matches

◆ monomialOrderDecodeToActualExponents()

void monomialOrderDecodeToActualExponents ( const MonomialOrder * mo,
const_monomial psums,
exponents_t expon )

Definition at line 548 of file imonorder.cpp.

551{
552 if (mo == nullptr) return;
553 int *tmpexp = static_cast<int *>(alloca((mo->nvars + 1) * sizeof(int)));
554 int i, j, nvars;
555 deg_t *degs = mo->degs;
556 deg_t *d;
557 struct mo_block *b = mo->blocks;
558 int nblocks = mo->nblocks;
559 int *e = expon;
560 const int *p = psums;
561 for (i = nblocks; i > 0; --i, b++) switch (b->typ)
562 {
563 case MO_LEX:
564 case MO_LAURENT:
565 nvars = b->nvars;
566 p = psums + b->first_slot;
567 e = expon + b->first_exp;
568 for (j = 0; j < nvars; j++) *e++ = *p++;
569 break;
570 case MO_REVLEX:
572 nvars = b->nvars;
573 p = psums + b->first_slot;
574 e = expon + b->first_exp;
575 for (j = 0; j < nvars; j++) *e++ = safe::minus(*p++);
576 break;
577 case MO_GREVLEX:
578 nvars = b->nvars;
579 p = psums + b->first_slot + nvars - 1;
580 e = expon + b->first_exp;
581 *e++ = *p--;
582 for (j = nvars - 1; j >= 1; --j, --p) *e++ = safe::sub(*p, p[1]);
583 break;
584 case MO_GREVLEX_WTS:
585 nvars = b->nvars;
586 d = degs + b->first_exp;
587 p = psums + b->first_slot + nvars - 1;
588 e = expon + b->first_exp;
589 *e++ = *p-- / *d++;
590 for (j = nvars - 1; j >= 1; --j, --p)
591 *e++ = safe::sub(*p, p[1]) / *d++;
592 break;
593 case MO_GREVLEX4:
594 nvars = b->nvars;
595 MO_unpack4(nvars, psums + b->first_slot, tmpexp);
596 p = tmpexp + nvars - 1;
597 e = expon + b->first_exp;
598 *e++ = *p--;
599 for (j = nvars - 1; j >= 1; --j, --p) *e++ = safe::sub(*p, p[1]);
600 break;
601 case MO_GREVLEX4_WTS:
602 nvars = b->nvars;
603 d = degs + b->first_exp;
604 MO_unpack4(nvars, psums + b->first_slot, tmpexp);
605 p = tmpexp + nvars - 1;
606 e = expon + b->first_exp;
607 *e++ = *p-- / *d++;
608 for (j = nvars - 1; j >= 1; --j, --p)
609 *e++ = safe::sub(*p, p[1]) / *d++;
610 break;
611 case MO_GREVLEX2:
612 nvars = b->nvars;
613 MO_unpack2(nvars, psums + b->first_slot, tmpexp);
614 p = tmpexp + nvars - 1;
615 e = expon + b->first_exp;
616 *e++ = *p--;
617 for (j = nvars - 1; j >= 1; --j, --p) *e++ = safe::sub(*p, p[1]);
618 break;
619 case MO_GREVLEX2_WTS:
620 nvars = b->nvars;
621 d = degs + b->first_exp;
622 MO_unpack2(nvars, psums + b->first_slot, tmpexp);
623 p = tmpexp + nvars - 1;
624 e = expon + b->first_exp;
625 *e++ = *p-- / *d++;
626 for (j = nvars - 1; j >= 1; --j, --p)
627 *e++ = safe::sub(*p, p[1]) / *d++;
628 break;
629 case MO_LEX4:
630 nvars = b->nvars;
631 e = expon + b->first_exp;
632 MO_unpack4(nvars, psums + b->first_slot, e);
633 break;
634 case MO_LEX2:
635 nvars = b->nvars;
636 e = expon + b->first_exp;
637 MO_unpack2(nvars, psums + b->first_slot, e);
638 break;
639 case MO_WEIGHTS:
640 break;
641 case MO_POSITION_UP:
642 case MO_POSITION_DOWN:
643 /* should not occur, but do nothing in any case */
644 break;
645 case MO_NC_LEX:
646 /* nothing to do here */
647 break;
648 }
649}
int p
static void MO_unpack4(int nvars, const int *slots, int *expon)
static void MO_unpack2(int nvars, const int *slots, int *expon)
int32_t deg_t
Definition imonorder.hpp:43
@ MO_GREVLEX4_WTS
@ MO_LAURENT_REVLEX
@ MO_NC_LEX
@ MO_LEX4
@ MO_REVLEX
@ MO_POSITION_UP
@ MO_LEX
@ MO_GREVLEX
@ MO_LEX2
@ MO_GREVLEX4
@ MO_LAURENT
@ MO_GREVLEX2_WTS
@ MO_WEIGHTS
@ MO_POSITION_DOWN
@ MO_GREVLEX2
@ MO_GREVLEX_WTS
static int32_t sub(int32_t x, int32_t y, const char *msg)
Definition overflow.hpp:144
static int32_t minus(int32_t x, const char *msg)
Definition overflow.hpp:185
enum MonomialOrdering_type typ
Definition imonorder.hpp:49
int first_exp
Definition imonorder.hpp:52
int first_slot
Definition imonorder.hpp:53

References mo_block::first_exp, mo_block::first_slot, safe::minus(), MO_GREVLEX, MO_GREVLEX2, MO_GREVLEX2_WTS, MO_GREVLEX4, MO_GREVLEX4_WTS, MO_GREVLEX_WTS, MO_LAURENT, MO_LAURENT_REVLEX, MO_LEX, MO_LEX2, MO_LEX4, MO_NC_LEX, MO_POSITION_DOWN, MO_POSITION_UP, MO_REVLEX, MO_unpack2(), MO_unpack4(), MO_WEIGHTS, mo_block::nvars, p, safe::sub(), and mo_block::typ.

Referenced by Monoid::to_expvector().