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

◆ monomialOrderEncodeFromActualExponents()

void monomialOrderEncodeFromActualExponents ( const MonomialOrder * mo,
const_exponents a,
monomial b )

Definition at line 411 of file imonorder.cpp.

415{
416 if (mo == nullptr) return;
417 int *tmpexp = static_cast<int *>(alloca((mo->nvars + 1) * sizeof(int)));
418 int i, j, nvars, s;
419 int *p1;
420 deg_t *degs;
421 struct mo_block *b = mo->blocks;
422 int nblocks = mo->nblocks;
423 const int *e = expon;
424 int *p = result_psums;
425 for (i = nblocks; i > 0; --i, b++) switch (b->typ)
426 {
427 case MO_LEX:
428 case MO_LAURENT:
429 nvars = b->nvars;
430 for (j = 0; j < nvars; j++) *p++ = *e++;
431 break;
432 case MO_REVLEX:
434 nvars = b->nvars;
435 for (j = 0; j < nvars; j++) *p++ = safe::minus(*e++);
436 break;
437 case MO_GREVLEX:
438 nvars = b->nvars;
439 p += b->nslots;
440 p1 = p;
441 *--p1 = *e++;
442 for (j = 1; j < nvars; j++)
443 {
444 --p1;
445 *p1 = safe::add(*e++, p1[1]);
446 }
447 break;
448 case MO_GREVLEX_WTS:
449 nvars = b->nvars;
450 degs = mo->degs + b->first_exp;
451 p += b->nslots;
452 p1 = p;
453 *--p1 = safe::mult(*e++, *degs++);
454 for (j = 1; j < nvars; j++)
455 {
456 --p1;
457 int tmp = safe::mult(*e++, *degs++);
458 *p1 = safe::add(tmp, p1[1]);
459 }
460 break;
461 case MO_GREVLEX4:
462 nvars = b->nvars;
463 p1 = tmpexp + b->nvars;
464 *--p1 = *e++;
465 for (j = 1; j < nvars; j++)
466 {
467 --p1;
468 *p1 = safe::add(*e++, p1[1]);
469 }
470 MO_pack4(nvars, p1, p);
471 p += b->nslots;
472 break;
473 case MO_GREVLEX4_WTS:
474 nvars = b->nvars;
475 degs = mo->degs + b->first_exp;
476 p1 = tmpexp + b->nvars;
477 *--p1 = safe::mult(*e++, *degs++);
478 for (j = 1; j < nvars; j++)
479 {
480 --p1;
481 int tmp = safe::mult(*e++, *degs++);
482 *p1 = safe::add(tmp, p1[1]);
483 }
484 MO_pack4(nvars, p1, p);
485 p += b->nslots;
486 break;
487 case MO_GREVLEX2:
488 nvars = b->nvars;
489 p1 = tmpexp + b->nvars;
490 *--p1 = *e++;
491 for (j = 1; j < nvars; j++)
492 {
493 --p1;
494 *p1 = safe::add(*e++, p1[1]);
495 }
496 MO_pack2(nvars, p1, p);
497 p += b->nslots;
498 break;
499 case MO_GREVLEX2_WTS:
500 nvars = b->nvars;
501 degs = mo->degs + b->first_exp;
502 p1 = tmpexp + b->nvars;
503 *--p1 = safe::mult(*e++, *degs++);
504 for (j = 1; j < nvars; j++)
505 {
506 --p1;
507 int tmp = safe::mult(*e++, *degs++);
508 *p1 = safe::add(tmp, p1[1]);
509 }
510 MO_pack2(nvars, p1, p);
511 p += b->nslots;
512 break;
513 case MO_LEX4:
514 nvars = b->nvars;
515 MO_pack4(nvars, e, p);
516 p += b->nslots;
517 e += nvars;
518 break;
519 case MO_LEX2:
520 nvars = b->nvars;
521 MO_pack2(nvars, e, p);
522 p += b->nslots;
523 e += nvars;
524 break;
525 case MO_WEIGHTS:
526 if (b->nweights == 0)
527 {
528 s = 0;
529 }
530 else
531 {
532 s = safe::mult(b->weights[0], expon[0]);
533 for (j = 1; j < b->nweights; j++)
534 s = safe::add(s, safe::mult(b->weights[j], expon[j]));
535 }
536 *p++ = s;
537 break;
538 case MO_POSITION_UP:
539 case MO_POSITION_DOWN:
540 /* nothing to do here */
541 break;
542 case MO_NC_LEX:
543 /* nothing to do here */
544 break;
545 }
546}
int p
int p1
static void MO_pack4(int nvars, const int *expon, int *slots)
static void MO_pack2(int nvars, const int *expon, int *slots)
int32_t deg_t
Definition imonorder.hpp:43
void size_t s
Definition m2-mem.cpp:271
@ 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 mult(int32_t x, int32_t y, const char *msg)
Definition overflow.hpp:236
static int32_t add(int32_t x, int32_t y, const char *msg)
Definition overflow.hpp:116
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
deg_t * weights
Definition imonorder.hpp:55
int nweights
Definition imonorder.hpp:54

References safe::add(), mo_block::first_exp, 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_pack2(), MO_pack4(), MO_POSITION_DOWN, MO_POSITION_UP, MO_REVLEX, MO_WEIGHTS, monomial, safe::mult(), mo_block::nslots, mo_block::nvars, mon_part::nvars, mo_block::nweights, p, p1, s, mo_block::typ, and mo_block::weights.

Referenced by Monoid::from_expvector().