Public Member Functions | Private Member Functions | Private Attributes
mp_permmatrix Class Reference

Public Member Functions

 mp_permmatrix ()
 
 mp_permmatrix (matrix, ring)
 
 mp_permmatrix (mp_permmatrix *)
 
 ~mp_permmatrix ()
 
int mpGetRow ()
 
int mpGetCol ()
 
int mpGetRdim ()
 
int mpGetCdim ()
 
int mpGetSign ()
 
void mpSetSearch (int s)
 
void mpSaveArray ()
 
poly mpGetElem (int, int)
 
void mpSetElem (poly, int, int)
 
void mpDelElem (int, int)
 
void mpElimBareiss (poly)
 
int mpPivotBareiss (row_col_weight *)
 
int mpPivotRow (row_col_weight *, int)
 
void mpToIntvec (intvec *)
 
void mpRowReorder ()
 
void mpColReorder ()
 

Private Member Functions

void mpInitMat ()
 
polympRowAdr (int r)
 
polympColAdr (int c)
 
void mpRowWeight (float *)
 
void mpColWeight (float *)
 
void mpRowSwap (int, int)
 
void mpColSwap (int, int)
 

Private Attributes

int a_m
 
int a_n
 
int s_m
 
int s_n
 
int sign
 
int piv_s
 
int * qrow
 
int * qcol
 
polyXarray
 
ring _R
 

Detailed Description

Definition at line 834 of file matpol.cc.

Constructor & Destructor Documentation

◆ mp_permmatrix() [1/3]

mp_permmatrix::mp_permmatrix ( )
inline

Definition at line 851 of file matpol.cc.

851 : a_m(0) {}

◆ mp_permmatrix() [2/3]

mp_permmatrix::mp_permmatrix ( matrix  A,
ring  R 
)

Definition at line 872 of file matpol.cc.

872  : sign(1)
873 {
874  a_m = A->nrows;
875  a_n = A->ncols;
876  this->mpInitMat();
877  Xarray = A->m;
878  _R=R;
879 }
int ncols
Definition: matpol.h:22
poly * Xarray
Definition: matpol.cc:839
poly * m
Definition: matpol.h:19
int nrows
Definition: matpol.h:21
const ring R
Definition: DebugPrint.cc:36
void mpInitMat()
Definition: matpol.cc:994

◆ mp_permmatrix() [3/3]

mp_permmatrix::mp_permmatrix ( mp_permmatrix M)

Definition at line 881 of file matpol.cc.

882 {
883  poly p, *athis, *aM;
884  int i, j;
885 
886  _R=M->_R;
887  a_m = M->s_m;
888  a_n = M->s_n;
889  sign = M->sign;
890  this->mpInitMat();
891  Xarray = (poly *)omAlloc0(a_m*a_n*sizeof(poly));
892  for (i=a_m-1; i>=0; i--)
893  {
894  athis = this->mpRowAdr(i);
895  aM = M->mpRowAdr(i);
896  for (j=a_n-1; j>=0; j--)
897  {
898  p = aM[M->qcol[j]];
899  if (p)
900  {
901  athis[j] = p_Copy(p,_R);
902  }
903  }
904  }
905 }
int * qcol
Definition: matpol.cc:838
return P p
Definition: myNF.cc:203
poly * mpRowAdr(int r)
Definition: matpol.cc:842
static poly p_Copy(poly p, const ring r)
returns a copy of p
Definition: p_polys.h:804
poly * Xarray
Definition: matpol.cc:839
int j
Definition: myNF.cc:70
int i
Definition: cfEzgcd.cc:123
void mpInitMat()
Definition: matpol.cc:994
polyrec * poly
Definition: hilb.h:10
#define omAlloc0(size)
Definition: omAllocDecl.h:211

◆ ~mp_permmatrix()

mp_permmatrix::~mp_permmatrix ( )

Definition at line 907 of file matpol.cc.

908 {
909  int k;
910 
911  if (a_m != 0)
912  {
913  omFreeSize((ADDRESS)qrow,a_m*sizeof(int));
914  omFreeSize((ADDRESS)qcol,a_n*sizeof(int));
915  if (Xarray != NULL)
916  {
917  for (k=a_m*a_n-1; k>=0; k--)
918  p_Delete(&Xarray[k],_R);
919  omFreeSize((ADDRESS)Xarray,a_m*a_n*sizeof(poly));
920  }
921  }
922 }
int * qcol
Definition: matpol.cc:838
#define omFreeSize(addr, size)
Definition: omAllocDecl.h:260
void * ADDRESS
Definition: auxiliary.h:115
int k
Definition: cfEzgcd.cc:93
poly * Xarray
Definition: matpol.cc:839
int * qrow
Definition: matpol.cc:838
static void p_Delete(poly *p, const ring r)
Definition: p_polys.h:843
#define NULL
Definition: omList.c:10
polyrec * poly
Definition: hilb.h:10

Member Function Documentation

◆ mpColAdr()

poly* mp_permmatrix::mpColAdr ( int  c)
inlineprivate

Definition at line 844 of file matpol.cc.

845  { return &(Xarray[qcol[c]]); }
int * qcol
Definition: matpol.cc:838
poly * Xarray
Definition: matpol.cc:839

◆ mpColReorder()

void mp_permmatrix::mpColReorder ( )

Definition at line 1007 of file matpol.cc.

1008 {
1009  int k, j, j1, j2;
1010 
1011  if (a_n > a_m)
1012  k = a_n - a_m;
1013  else
1014  k = 0;
1015  for (j=a_n-1; j>=k; j--)
1016  {
1017  j1 = qcol[j];
1018  if (j1 != j)
1019  {
1020  this->mpColSwap(j1, j);
1021  j2 = 0;
1022  while (qcol[j2] != j) j2++;
1023  qcol[j2] = j1;
1024  }
1025  }
1026 }
int * qcol
Definition: matpol.cc:838
int k
Definition: cfEzgcd.cc:93
int j
Definition: myNF.cc:70
void mpColSwap(int, int)
Definition: matpol.cc:980

◆ mpColSwap()

void mp_permmatrix::mpColSwap ( int  j1,
int  j2 
)
private

Definition at line 980 of file matpol.cc.

981 {
982  poly p, *a1, *a2;
983  int i, k = a_n*a_m;
984 
985  a1 = &(Xarray[j1]);
986  a2 = &(Xarray[j2]);
987  for (i=0; i< k; i+=a_n)
988  {
989  p = a1[i];
990  a1[i] = a2[i];
991  a2[i] = p;
992  }
993 }
return P p
Definition: myNF.cc:203
int k
Definition: cfEzgcd.cc:93
poly * Xarray
Definition: matpol.cc:839
int i
Definition: cfEzgcd.cc:123
polyrec * poly
Definition: hilb.h:10

◆ mpColWeight()

void mp_permmatrix::mpColWeight ( float *  wcol)
private

Definition at line 926 of file matpol.cc.

927 {
928  poly p, *a;
929  int i, j;
930  float count;
931 
932  for (j=s_n; j>=0; j--)
933  {
934  a = this->mpColAdr(j);
935  count = 0.0;
936  for(i=s_m; i>=0; i--)
937  {
938  p = a[a_n*qrow[i]];
939  if (p)
940  count += mp_PolyWeight(p,_R);
941  }
942  wcol[j] = count;
943  }
944 }
int status int void size_t count
Definition: si_signals.h:59
const poly a
Definition: syzextra.cc:212
return P p
Definition: myNF.cc:203
poly * mpColAdr(int c)
Definition: matpol.cc:844
int j
Definition: myNF.cc:70
int i
Definition: cfEzgcd.cc:123
int * qrow
Definition: matpol.cc:838
polyrec * poly
Definition: hilb.h:10
static float mp_PolyWeight(poly p, const ring r)
Definition: matpol.cc:1211

◆ mpDelElem()

void mp_permmatrix::mpDelElem ( int  ,
int   
)

◆ mpElimBareiss()

void mp_permmatrix::mpElimBareiss ( poly  div)

Definition at line 1153 of file matpol.cc.

1154 {
1155  poly piv, elim, q1, q2, *ap, *a;
1156  int i, j, jj;
1157 
1158  ap = this->mpRowAdr(s_m);
1159  piv = ap[qcol[s_n]];
1160  for(i=s_m-1; i>=0; i--)
1161  {
1162  a = this->mpRowAdr(i);
1163  elim = a[qcol[s_n]];
1164  if (elim != NULL)
1165  {
1166  elim = p_Neg(elim,_R);
1167  for (j=s_n-1; j>=0; j--)
1168  {
1169  q2 = NULL;
1170  jj = qcol[j];
1171  if (ap[jj] != NULL)
1172  {
1173  q2 = SM_MULT(ap[jj], elim, div,_R);
1174  if (a[jj] != NULL)
1175  {
1176  q1 = SM_MULT(a[jj], piv, div,_R);
1177  p_Delete(&a[jj],_R);
1178  q2 = p_Add_q(q2, q1, _R);
1179  }
1180  }
1181  else if (a[jj] != NULL)
1182  {
1183  q2 = SM_MULT(a[jj], piv, div, _R);
1184  }
1185  if ((q2!=NULL) && div)
1186  SM_DIV(q2, div, _R);
1187  a[jj] = q2;
1188  }
1189  p_Delete(&a[qcol[s_n]], _R);
1190  }
1191  else
1192  {
1193  for (j=s_n-1; j>=0; j--)
1194  {
1195  jj = qcol[j];
1196  if (a[jj] != NULL)
1197  {
1198  q2 = SM_MULT(a[jj], piv, div, _R);
1199  p_Delete(&a[jj], _R);
1200  if (div)
1201  SM_DIV(q2, div, _R);
1202  a[jj] = q2;
1203  }
1204  }
1205  }
1206  }
1207 }
int * qcol
Definition: matpol.cc:838
const poly a
Definition: syzextra.cc:212
poly * mpRowAdr(int r)
Definition: matpol.cc:842
int j
Definition: myNF.cc:70
int i
Definition: cfEzgcd.cc:123
static void p_Delete(poly *p, const ring r)
Definition: p_polys.h:843
CF_NO_INLINE CanonicalForm div(const CanonicalForm &, const CanonicalForm &)
CF_INLINE CanonicalForm div, mod ( const CanonicalForm & lhs, const CanonicalForm & rhs ) ...
Definition: cf_inline.cc:553
#define NULL
Definition: omList.c:10
#define SM_MULT
Definition: sparsmat.h:23
#define SM_DIV
Definition: sparsmat.h:24
static poly p_Neg(poly p, const ring r)
Definition: p_polys.h:1013
polyrec * poly
Definition: hilb.h:10
static poly p_Add_q(poly p, poly q, const ring r)
Definition: p_polys.h:877

◆ mpGetCdim()

int mp_permmatrix::mpGetCdim ( )
inline

Definition at line 858 of file matpol.cc.

858 { return s_n; }

◆ mpGetCol()

int mp_permmatrix::mpGetCol ( )

◆ mpGetElem()

poly mp_permmatrix::mpGetElem ( int  r,
int  c 
)

Definition at line 1145 of file matpol.cc.

1146 {
1147  return Xarray[a_n*qrow[r]+qcol[c]];
1148 }
int * qcol
Definition: matpol.cc:838
poly * Xarray
Definition: matpol.cc:839
const ring r
Definition: syzextra.cc:208
int * qrow
Definition: matpol.cc:838

◆ mpGetRdim()

int mp_permmatrix::mpGetRdim ( )
inline

Definition at line 857 of file matpol.cc.

857 { return s_m; }

◆ mpGetRow()

int mp_permmatrix::mpGetRow ( )

◆ mpGetSign()

int mp_permmatrix::mpGetSign ( )
inline

Definition at line 859 of file matpol.cc.

859 { return sign; }

◆ mpInitMat()

void mp_permmatrix::mpInitMat ( )
private

Definition at line 994 of file matpol.cc.

995 {
996  int k;
997 
998  s_m = a_m;
999  s_n = a_n;
1000  piv_s = 0;
1001  qrow = (int *)omAlloc(a_m*sizeof(int));
1002  qcol = (int *)omAlloc(a_n*sizeof(int));
1003  for (k=a_m-1; k>=0; k--) qrow[k] = k;
1004  for (k=a_n-1; k>=0; k--) qcol[k] = k;
1005 }
int * qcol
Definition: matpol.cc:838
int k
Definition: cfEzgcd.cc:93
#define omAlloc(size)
Definition: omAllocDecl.h:210
int * qrow
Definition: matpol.cc:838

◆ mpPivotBareiss()

int mp_permmatrix::mpPivotBareiss ( row_col_weight C)

Definition at line 1068 of file matpol.cc.

1069 {
1070  poly p, *a;
1071  int i, j, iopt, jopt;
1072  float sum, f1, f2, fo, r, ro, lp;
1073  float *dr = C->wrow, *dc = C->wcol;
1074 
1075  fo = 1.0e20;
1076  ro = 0.0;
1077  iopt = jopt = -1;
1078 
1079  s_n--;
1080  s_m--;
1081  if (s_m == 0)
1082  return 0;
1083  if (s_n == 0)
1084  {
1085  for(i=s_m; i>=0; i--)
1086  {
1087  p = this->mpRowAdr(i)[qcol[0]];
1088  if (p)
1089  {
1090  f1 = mp_PolyWeight(p,_R);
1091  if (f1 < fo)
1092  {
1093  fo = f1;
1094  if (iopt >= 0)
1095  p_Delete(&(this->mpRowAdr(iopt)[qcol[0]]),_R);
1096  iopt = i;
1097  }
1098  else
1099  p_Delete(&(this->mpRowAdr(i)[qcol[0]]),_R);
1100  }
1101  }
1102  if (iopt >= 0)
1103  mpReplace(iopt, s_m, sign, qrow);
1104  return 0;
1105  }
1106  this->mpRowWeight(dr);
1107  this->mpColWeight(dc);
1108  sum = 0.0;
1109  for(i=s_m; i>=0; i--)
1110  sum += dr[i];
1111  for(i=s_m; i>=0; i--)
1112  {
1113  r = dr[i];
1114  a = this->mpRowAdr(i);
1115  for(j=s_n; j>=0; j--)
1116  {
1117  p = a[qcol[j]];
1118  if (p)
1119  {
1120  lp = mp_PolyWeight(p,_R);
1121  ro = r - lp;
1122  f1 = ro * (dc[j]-lp);
1123  if (f1 != 0.0)
1124  {
1125  f2 = lp * (sum - ro - dc[j]);
1126  f2 += f1;
1127  }
1128  else
1129  f2 = lp-r-dc[j];
1130  if (f2 < fo)
1131  {
1132  fo = f2;
1133  iopt = i;
1134  jopt = j;
1135  }
1136  }
1137  }
1138  }
1139  if (iopt < 0)
1140  return 0;
1141  mpReplace(iopt, s_m, sign, qrow);
1142  mpReplace(jopt, s_n, sign, qcol);
1143  return 1;
1144 }
int * qcol
Definition: matpol.cc:838
const poly a
Definition: syzextra.cc:212
return P p
Definition: myNF.cc:203
float * wcol
Definition: matpol.cc:802
void mpColWeight(float *)
Definition: matpol.cc:926
void mpRowWeight(float *)
Definition: matpol.cc:945
poly * mpRowAdr(int r)
Definition: matpol.cc:842
static void mpReplace(int j, int n, int &sign, int *perm)
Definition: matpol.cc:1053
const ring r
Definition: syzextra.cc:208
int j
Definition: myNF.cc:70
float * wrow
Definition: matpol.cc:802
int i
Definition: cfEzgcd.cc:123
int * qrow
Definition: matpol.cc:838
static void p_Delete(poly *p, const ring r)
Definition: p_polys.h:843
polyrec * poly
Definition: hilb.h:10
static float mp_PolyWeight(poly p, const ring r)
Definition: matpol.cc:1211

◆ mpPivotRow()

int mp_permmatrix::mpPivotRow ( row_col_weight ,
int   
)

◆ mpRowAdr()

poly* mp_permmatrix::mpRowAdr ( int  r)
inlineprivate

Definition at line 842 of file matpol.cc.

843  { return &(Xarray[a_n*qrow[r]]); }
poly * Xarray
Definition: matpol.cc:839
const ring r
Definition: syzextra.cc:208
int * qrow
Definition: matpol.cc:838

◆ mpRowReorder()

void mp_permmatrix::mpRowReorder ( )

Definition at line 1028 of file matpol.cc.

1029 {
1030  int k, i, i1, i2;
1031 
1032  if (a_m > a_n)
1033  k = a_m - a_n;
1034  else
1035  k = 0;
1036  for (i=a_m-1; i>=k; i--)
1037  {
1038  i1 = qrow[i];
1039  if (i1 != i)
1040  {
1041  this->mpRowSwap(i1, i);
1042  i2 = 0;
1043  while (qrow[i2] != i) i2++;
1044  qrow[i2] = i1;
1045  }
1046  }
1047 }
void mpRowSwap(int, int)
Definition: matpol.cc:965
int k
Definition: cfEzgcd.cc:93
int i
Definition: cfEzgcd.cc:123
int * qrow
Definition: matpol.cc:838

◆ mpRowSwap()

void mp_permmatrix::mpRowSwap ( int  i1,
int  i2 
)
private

Definition at line 965 of file matpol.cc.

966 {
967  poly p, *a1, *a2;
968  int j;
969 
970  a1 = &(Xarray[a_n*i1]);
971  a2 = &(Xarray[a_n*i2]);
972  for (j=a_n-1; j>= 0; j--)
973  {
974  p = a1[j];
975  a1[j] = a2[j];
976  a2[j] = p;
977  }
978 }
return P p
Definition: myNF.cc:203
poly * Xarray
Definition: matpol.cc:839
int j
Definition: myNF.cc:70
polyrec * poly
Definition: hilb.h:10

◆ mpRowWeight()

void mp_permmatrix::mpRowWeight ( float *  wrow)
private

Definition at line 945 of file matpol.cc.

946 {
947  poly p, *a;
948  int i, j;
949  float count;
950 
951  for (i=s_m; i>=0; i--)
952  {
953  a = this->mpRowAdr(i);
954  count = 0.0;
955  for(j=s_n; j>=0; j--)
956  {
957  p = a[qcol[j]];
958  if (p)
959  count += mp_PolyWeight(p,_R);
960  }
961  wrow[i] = count;
962  }
963 }
int status int void size_t count
Definition: si_signals.h:59
int * qcol
Definition: matpol.cc:838
const poly a
Definition: syzextra.cc:212
return P p
Definition: myNF.cc:203
poly * mpRowAdr(int r)
Definition: matpol.cc:842
int j
Definition: myNF.cc:70
int i
Definition: cfEzgcd.cc:123
polyrec * poly
Definition: hilb.h:10
static float mp_PolyWeight(poly p, const ring r)
Definition: matpol.cc:1211

◆ mpSaveArray()

void mp_permmatrix::mpSaveArray ( )
inline

Definition at line 861 of file matpol.cc.

861 { Xarray = NULL; }
poly * Xarray
Definition: matpol.cc:839
#define NULL
Definition: omList.c:10

◆ mpSetElem()

void mp_permmatrix::mpSetElem ( poly  ,
int  ,
int   
)

◆ mpSetSearch()

void mp_permmatrix::mpSetSearch ( int  s)

◆ mpToIntvec()

void mp_permmatrix::mpToIntvec ( intvec )

Field Documentation

◆ _R

ring mp_permmatrix::_R
private

Definition at line 840 of file matpol.cc.

◆ a_m

int mp_permmatrix::a_m
private

Definition at line 837 of file matpol.cc.

◆ a_n

int mp_permmatrix::a_n
private

Definition at line 837 of file matpol.cc.

◆ piv_s

int mp_permmatrix::piv_s
private

Definition at line 837 of file matpol.cc.

◆ qcol

int * mp_permmatrix::qcol
private

Definition at line 838 of file matpol.cc.

◆ qrow

int* mp_permmatrix::qrow
private

Definition at line 838 of file matpol.cc.

◆ s_m

int mp_permmatrix::s_m
private

Definition at line 837 of file matpol.cc.

◆ s_n

int mp_permmatrix::s_n
private

Definition at line 837 of file matpol.cc.

◆ sign

int mp_permmatrix::sign
private

Definition at line 837 of file matpol.cc.

◆ Xarray

poly* mp_permmatrix::Xarray
private

Definition at line 839 of file matpol.cc.


The documentation for this class was generated from the following file: