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 830 of file matpol.cc.

Constructor & Destructor Documentation

mp_permmatrix::mp_permmatrix ( )
inline

Definition at line 847 of file matpol.cc.

847 : a_m(0) {}
mp_permmatrix::mp_permmatrix ( matrix  A,
ring  R 
)

Definition at line 868 of file matpol.cc.

868  : sign(1)
869 {
870  a_m = A->nrows;
871  a_n = A->ncols;
872  this->mpInitMat();
873  Xarray = A->m;
874  _R=R;
875 }
int ncols
Definition: matpol.h:22
poly * Xarray
Definition: matpol.cc:835
poly * m
Definition: matpol.h:19
int nrows
Definition: matpol.h:21
const ring R
Definition: DebugPrint.cc:36
void mpInitMat()
Definition: matpol.cc:990
mp_permmatrix::mp_permmatrix ( mp_permmatrix M)

Definition at line 877 of file matpol.cc.

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

Definition at line 903 of file matpol.cc.

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

Member Function Documentation

poly* mp_permmatrix::mpColAdr ( int  c)
inlineprivate

Definition at line 840 of file matpol.cc.

841  { return &(Xarray[qcol[c]]); }
int * qcol
Definition: matpol.cc:834
poly * Xarray
Definition: matpol.cc:835
void mp_permmatrix::mpColReorder ( )

Definition at line 1003 of file matpol.cc.

1004 {
1005  int k, j, j1, j2;
1006 
1007  if (a_n > a_m)
1008  k = a_n - a_m;
1009  else
1010  k = 0;
1011  for (j=a_n-1; j>=k; j--)
1012  {
1013  j1 = qcol[j];
1014  if (j1 != j)
1015  {
1016  this->mpColSwap(j1, j);
1017  j2 = 0;
1018  while (qcol[j2] != j) j2++;
1019  qcol[j2] = j1;
1020  }
1021  }
1022 }
int * qcol
Definition: matpol.cc:834
int k
Definition: cfEzgcd.cc:93
int j
Definition: myNF.cc:70
void mpColSwap(int, int)
Definition: matpol.cc:976
void mp_permmatrix::mpColSwap ( int  j1,
int  j2 
)
private

Definition at line 976 of file matpol.cc.

977 {
978  poly p, *a1, *a2;
979  int i, k = a_n*a_m;
980 
981  a1 = &(Xarray[j1]);
982  a2 = &(Xarray[j2]);
983  for (i=0; i< k; i+=a_n)
984  {
985  p = a1[i];
986  a1[i] = a2[i];
987  a2[i] = p;
988  }
989 }
return P p
Definition: myNF.cc:203
int k
Definition: cfEzgcd.cc:93
poly * Xarray
Definition: matpol.cc:835
int i
Definition: cfEzgcd.cc:123
polyrec * poly
Definition: hilb.h:10
void mp_permmatrix::mpColWeight ( float *  wcol)
private

Definition at line 922 of file matpol.cc.

923 {
924  poly p, *a;
925  int i, j;
926  float count;
927 
928  for (j=s_n; j>=0; j--)
929  {
930  a = this->mpColAdr(j);
931  count = 0.0;
932  for(i=s_m; i>=0; i--)
933  {
934  p = a[a_n*qrow[i]];
935  if (p)
936  count += mp_PolyWeight(p,_R);
937  }
938  wcol[j] = count;
939  }
940 }
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:840
int j
Definition: myNF.cc:70
int i
Definition: cfEzgcd.cc:123
int * qrow
Definition: matpol.cc:834
polyrec * poly
Definition: hilb.h:10
static float mp_PolyWeight(poly p, const ring r)
Definition: matpol.cc:1207
void mp_permmatrix::mpDelElem ( int  ,
int   
)
void mp_permmatrix::mpElimBareiss ( poly  div)

Definition at line 1149 of file matpol.cc.

1150 {
1151  poly piv, elim, q1, q2, *ap, *a;
1152  int i, j, jj;
1153 
1154  ap = this->mpRowAdr(s_m);
1155  piv = ap[qcol[s_n]];
1156  for(i=s_m-1; i>=0; i--)
1157  {
1158  a = this->mpRowAdr(i);
1159  elim = a[qcol[s_n]];
1160  if (elim != NULL)
1161  {
1162  elim = p_Neg(elim,_R);
1163  for (j=s_n-1; j>=0; j--)
1164  {
1165  q2 = NULL;
1166  jj = qcol[j];
1167  if (ap[jj] != NULL)
1168  {
1169  q2 = SM_MULT(ap[jj], elim, div,_R);
1170  if (a[jj] != NULL)
1171  {
1172  q1 = SM_MULT(a[jj], piv, div,_R);
1173  p_Delete(&a[jj],_R);
1174  q2 = p_Add_q(q2, q1, _R);
1175  }
1176  }
1177  else if (a[jj] != NULL)
1178  {
1179  q2 = SM_MULT(a[jj], piv, div, _R);
1180  }
1181  if ((q2!=NULL) && div)
1182  SM_DIV(q2, div, _R);
1183  a[jj] = q2;
1184  }
1185  p_Delete(&a[qcol[s_n]], _R);
1186  }
1187  else
1188  {
1189  for (j=s_n-1; j>=0; j--)
1190  {
1191  jj = qcol[j];
1192  if (a[jj] != NULL)
1193  {
1194  q2 = SM_MULT(a[jj], piv, div, _R);
1195  p_Delete(&a[jj], _R);
1196  if (div)
1197  SM_DIV(q2, div, _R);
1198  a[jj] = q2;
1199  }
1200  }
1201  }
1202  }
1203 }
int * qcol
Definition: matpol.cc:834
const poly a
Definition: syzextra.cc:212
poly * mpRowAdr(int r)
Definition: matpol.cc:838
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:850
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:1018
polyrec * poly
Definition: hilb.h:10
static poly p_Add_q(poly p, poly q, const ring r)
Definition: p_polys.h:884
int mp_permmatrix::mpGetCdim ( )
inline

Definition at line 854 of file matpol.cc.

854 { return s_n; }
int mp_permmatrix::mpGetCol ( )
poly mp_permmatrix::mpGetElem ( int  r,
int  c 
)

Definition at line 1141 of file matpol.cc.

1142 {
1143  return Xarray[a_n*qrow[r]+qcol[c]];
1144 }
int * qcol
Definition: matpol.cc:834
poly * Xarray
Definition: matpol.cc:835
const ring r
Definition: syzextra.cc:208
int * qrow
Definition: matpol.cc:834
int mp_permmatrix::mpGetRdim ( )
inline

Definition at line 853 of file matpol.cc.

853 { return s_m; }
int mp_permmatrix::mpGetRow ( )
int mp_permmatrix::mpGetSign ( )
inline

Definition at line 855 of file matpol.cc.

855 { return sign; }
void mp_permmatrix::mpInitMat ( )
private

Definition at line 990 of file matpol.cc.

991 {
992  int k;
993 
994  s_m = a_m;
995  s_n = a_n;
996  piv_s = 0;
997  qrow = (int *)omAlloc(a_m*sizeof(int));
998  qcol = (int *)omAlloc(a_n*sizeof(int));
999  for (k=a_m-1; k>=0; k--) qrow[k] = k;
1000  for (k=a_n-1; k>=0; k--) qcol[k] = k;
1001 }
int * qcol
Definition: matpol.cc:834
int k
Definition: cfEzgcd.cc:93
#define omAlloc(size)
Definition: omAllocDecl.h:210
int * qrow
Definition: matpol.cc:834
int mp_permmatrix::mpPivotBareiss ( row_col_weight C)

Definition at line 1064 of file matpol.cc.

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

Definition at line 838 of file matpol.cc.

839  { return &(Xarray[a_n*qrow[r]]); }
poly * Xarray
Definition: matpol.cc:835
const ring r
Definition: syzextra.cc:208
int * qrow
Definition: matpol.cc:834
void mp_permmatrix::mpRowReorder ( )

Definition at line 1024 of file matpol.cc.

1025 {
1026  int k, i, i1, i2;
1027 
1028  if (a_m > a_n)
1029  k = a_m - a_n;
1030  else
1031  k = 0;
1032  for (i=a_m-1; i>=k; i--)
1033  {
1034  i1 = qrow[i];
1035  if (i1 != i)
1036  {
1037  this->mpRowSwap(i1, i);
1038  i2 = 0;
1039  while (qrow[i2] != i) i2++;
1040  qrow[i2] = i1;
1041  }
1042  }
1043 }
void mpRowSwap(int, int)
Definition: matpol.cc:961
int k
Definition: cfEzgcd.cc:93
int i
Definition: cfEzgcd.cc:123
int * qrow
Definition: matpol.cc:834
void mp_permmatrix::mpRowSwap ( int  i1,
int  i2 
)
private

Definition at line 961 of file matpol.cc.

962 {
963  poly p, *a1, *a2;
964  int j;
965 
966  a1 = &(Xarray[a_n*i1]);
967  a2 = &(Xarray[a_n*i2]);
968  for (j=a_n-1; j>= 0; j--)
969  {
970  p = a1[j];
971  a1[j] = a2[j];
972  a2[j] = p;
973  }
974 }
return P p
Definition: myNF.cc:203
poly * Xarray
Definition: matpol.cc:835
int j
Definition: myNF.cc:70
polyrec * poly
Definition: hilb.h:10
void mp_permmatrix::mpRowWeight ( float *  wrow)
private

Definition at line 941 of file matpol.cc.

942 {
943  poly p, *a;
944  int i, j;
945  float count;
946 
947  for (i=s_m; i>=0; i--)
948  {
949  a = this->mpRowAdr(i);
950  count = 0.0;
951  for(j=s_n; j>=0; j--)
952  {
953  p = a[qcol[j]];
954  if (p)
955  count += mp_PolyWeight(p,_R);
956  }
957  wrow[i] = count;
958  }
959 }
int status int void size_t count
Definition: si_signals.h:59
int * qcol
Definition: matpol.cc:834
const poly a
Definition: syzextra.cc:212
return P p
Definition: myNF.cc:203
poly * mpRowAdr(int r)
Definition: matpol.cc:838
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:1207
void mp_permmatrix::mpSaveArray ( )
inline

Definition at line 857 of file matpol.cc.

857 { Xarray = NULL; }
poly * Xarray
Definition: matpol.cc:835
#define NULL
Definition: omList.c:10
void mp_permmatrix::mpSetElem ( poly  ,
int  ,
int   
)
void mp_permmatrix::mpSetSearch ( int  s)
void mp_permmatrix::mpToIntvec ( intvec )

Field Documentation

ring mp_permmatrix::_R
private

Definition at line 836 of file matpol.cc.

int mp_permmatrix::a_m
private

Definition at line 833 of file matpol.cc.

int mp_permmatrix::a_n
private

Definition at line 833 of file matpol.cc.

int mp_permmatrix::piv_s
private

Definition at line 833 of file matpol.cc.

int * mp_permmatrix::qcol
private

Definition at line 834 of file matpol.cc.

int* mp_permmatrix::qrow
private

Definition at line 834 of file matpol.cc.

int mp_permmatrix::s_m
private

Definition at line 833 of file matpol.cc.

int mp_permmatrix::s_n
private

Definition at line 833 of file matpol.cc.

int mp_permmatrix::sign
private

Definition at line 833 of file matpol.cc.

poly* mp_permmatrix::Xarray
private

Definition at line 835 of file matpol.cc.


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