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

◆ monomialOrderingToMatrix()

bool monomialOrderingToMatrix ( const struct MonomialOrdering & mo,
std::vector< int > & mat,
bool & base_is_revlex,
int & component_direction,
int & component_is_before_row )

Definition at line 861 of file monomial-ordering.cpp.

869{
870 // a false return value means an error has occurred.
871 int nvars = rawNumberOfVariables(&mo);
872 base_is_revlex = true;
873 enum LastBlock { LEX, REVLEX, WEIGHTS, NONE };
874 LastBlock last = NONE;
875 int nwts = 0; // local var used in MO_WEIGHTS section
876 int nrows = 0;
877 int firstvar = 0;
878 component_direction = 0;
879 component_is_before_row =
880 -2; // what should the default value be? Probably: -1.
881 size_t last_element = 0; // The vector 'mat' will be resized back to this
882 // value if the last part of the order is lex or
883 // revlex.
884 for (int i = 0; i < mo.len; i++)
885 {
886 mon_part p = mo.array[i];
887 switch (p->type)
888 {
889 case MO_LEX:
890 case MO_LEX2:
891 case MO_LEX4:
892 // printf("lex %d\n", p->nvars);
893 last_element = mat.size();
894 for (int j = 0; j < p->nvars; j++)
895 {
896 write_row(mat, nvars, firstvar + j, 1);
897 }
898 last = LEX;
899 firstvar += p->nvars;
900 nrows += p->nvars;
901 break;
902 case MO_GREVLEX:
903 case MO_GREVLEX2:
904 case MO_GREVLEX4:
905 // printf("grevlex %d %ld\n", p->nvars, p->wts);
906 write_weights(mat, nvars, firstvar, p->wts, p->nvars);
907 last_element = mat.size();
908 for (int j = p->nvars - 1; j >= 1; --j)
909 {
910 write_row(mat, nvars, firstvar + j, -1);
911 }
912 last = REVLEX;
913 firstvar += p->nvars;
914 nrows += p->nvars;
915 break;
916 case MO_GREVLEX_WTS:
917 case MO_GREVLEX2_WTS:
918 case MO_GREVLEX4_WTS:
919 // printf("grevlex_wts %d %ld\n", p->nvars, p->wts);
920 write_weights(mat, nvars, firstvar, p->wts, p->nvars);
921 last_element = mat.size();
922 for (int j = p->nvars - 1; j >= 1; --j)
923 {
924 write_row(mat, nvars, firstvar + j, -1);
925 }
926 last = REVLEX;
927 firstvar += p->nvars;
928 nrows += p->nvars;
929 break;
930 case MO_REVLEX:
931 // printf("revlex %d\n", p->nvars);
932 last_element = mat.size();
933 for (int j = p->nvars - 1; j >= 0; --j)
934 {
935 write_row(mat, nvars, firstvar + j, -1);
936 }
937 last = REVLEX;
938 firstvar += p->nvars;
939 nrows += p->nvars;
940 break;
941 case MO_WEIGHTS:
942 // printf("matsize= %d weights %d p->wts=%lu\n", mat.size(),
943 // p->nvars, p->wts);
944 nwts = (p->nvars > nvars ? nvars : p->nvars);
945 write_weights(mat, nvars, 0, p->wts, nwts);
946 nrows++;
947 last_element = mat.size();
948 last = WEIGHTS;
949 break;
950 case MO_LAURENT:
952 case MO_NC_LEX:
953 return false;
954 break;
955 case MO_POSITION_UP:
956 component_direction = 1;
957 component_is_before_row = nrows;
958 break;
959 case MO_POSITION_DOWN:
960 component_direction = -1;
961 component_is_before_row = nrows;
962 break;
963 default:
964 // DO nothing
965 break;
966 }
967 }
968 if (last == LEX)
969 {
970 // last block was lex, so use lex tie-breaker
971 mat.resize(last_element);
972 if (nrows == component_is_before_row) component_is_before_row = -1;
973 base_is_revlex = false;
974 }
975 else if (last == REVLEX)
976 {
977 // last block was revlex, so use revlex tie-breaker
978 if (nrows == component_is_before_row) component_is_before_row = -1;
979 mat.resize(last_element);
980 }
981 else
982 {
983 // last block is a weight vector, so use revlex as the tie-breaker.
984 // nothing to change here.
985 }
986 return true;
987}
int p
static void write_weights(std::vector< int > &grading, int nvars, int firstvar, int *wts, int nwts)
static void write_row(std::vector< int > &grading, int nvars, int which, int value)
int rawNumberOfVariables(const MonomialOrdering *mo)
@ 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

References MonomialOrdering::array, MonomialOrdering::len, 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_WEIGHTS, mon_part::nvars, p, rawNumberOfVariables(), write_row(), and write_weights().

Referenced by MonomialInfo::MonomialInfo(), rawMGB(), and rawMonomialOrderingToMatrix().