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
 
intqrow
 
intqcol
 
polyXarray
 
ring _R
 

Detailed Description

Definition at line 829 of file matpol.cc.

Constructor & Destructor Documentation

mp_permmatrix::mp_permmatrix ( )
inline

Definition at line 846 of file matpol.cc.

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

Definition at line 867 of file matpol.cc.

867  : sign(1)
868 {
869  a_m = A->nrows;
870  a_n = A->ncols;
871  this->mpInitMat();
872  Xarray = A->m;
873  _R=R;
874 }
int ncols
Definition: matpol.h:22
poly * Xarray
Definition: matpol.cc:834
poly * m
Definition: matpol.h:19
int nrows
Definition: matpol.h:21
void mpInitMat()
Definition: matpol.cc:989
#define R
Definition: sirandom.c:26
mp_permmatrix::mp_permmatrix ( mp_permmatrix M)

Definition at line 876 of file matpol.cc.

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

Definition at line 902 of file matpol.cc.

903 {
904  int k;
905 
906  if (a_m != 0)
907  {
908  omFreeSize((ADDRESS)qrow,a_m*sizeof(int));
909  omFreeSize((ADDRESS)qcol,a_n*sizeof(int));
910  if (Xarray != NULL)
911  {
912  for (k=a_m*a_n-1; k>=0; k--)
913  p_Delete(&Xarray[k],_R);
914  omFreeSize((ADDRESS)Xarray,a_m*a_n*sizeof(poly));
915  }
916  }
917 }
int * qcol
Definition: matpol.cc:833
#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:834
polyrec * poly
Definition: hilb.h:10
int * qrow
Definition: matpol.cc:833
static void p_Delete(poly *p, const ring r)
Definition: p_polys.h:850
#define NULL
Definition: omList.c:10

Member Function Documentation

poly* mp_permmatrix::mpColAdr ( int  c)
inlineprivate

Definition at line 839 of file matpol.cc.

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

Definition at line 1002 of file matpol.cc.

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

Definition at line 975 of file matpol.cc.

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

Definition at line 921 of file matpol.cc.

922 {
923  poly p, *a;
924  int i, j;
925  float count;
926 
927  for (j=s_n; j>=0; j--)
928  {
929  a = this->mpColAdr(j);
930  count = 0.0;
931  for(i=s_m; i>=0; i--)
932  {
933  p = a[a_n*qrow[i]];
934  if (p)
935  count += mp_PolyWeight(p,_R);
936  }
937  wcol[j] = count;
938  }
939 }
int status int void size_t count
Definition: si_signals.h:58
const poly a
Definition: syzextra.cc:212
return P p
Definition: myNF.cc:203
poly * mpColAdr(int c)
Definition: matpol.cc:839
int j
Definition: myNF.cc:70
polyrec * poly
Definition: hilb.h:10
int i
Definition: cfEzgcd.cc:123
int * qrow
Definition: matpol.cc:833
static float mp_PolyWeight(poly p, const ring r)
Definition: matpol.cc:1206
void mp_permmatrix::mpDelElem ( int  ,
int   
)
void mp_permmatrix::mpElimBareiss ( poly  div)

Definition at line 1148 of file matpol.cc.

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

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

Definition at line 1140 of file matpol.cc.

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

Definition at line 852 of file matpol.cc.

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

Definition at line 854 of file matpol.cc.

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

Definition at line 989 of file matpol.cc.

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

Definition at line 1063 of file matpol.cc.

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

Definition at line 837 of file matpol.cc.

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

Definition at line 1023 of file matpol.cc.

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

Definition at line 960 of file matpol.cc.

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

Definition at line 940 of file matpol.cc.

941 {
942  poly p, *a;
943  int i, j;
944  float count;
945 
946  for (i=s_m; i>=0; i--)
947  {
948  a = this->mpRowAdr(i);
949  count = 0.0;
950  for(j=s_n; j>=0; j--)
951  {
952  p = a[qcol[j]];
953  if (p)
954  count += mp_PolyWeight(p,_R);
955  }
956  wrow[i] = count;
957  }
958 }
int status int void size_t count
Definition: si_signals.h:58
int * qcol
Definition: matpol.cc:833
const poly a
Definition: syzextra.cc:212
return P p
Definition: myNF.cc:203
poly * mpRowAdr(int r)
Definition: matpol.cc:837
int j
Definition: myNF.cc:70
polyrec * poly
Definition: hilb.h:10
int i
Definition: cfEzgcd.cc:123
static float mp_PolyWeight(poly p, const ring r)
Definition: matpol.cc:1206
void mp_permmatrix::mpSaveArray ( )
inline

Definition at line 856 of file matpol.cc.

856 { Xarray = NULL; }
poly * Xarray
Definition: matpol.cc:834
#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 835 of file matpol.cc.

int mp_permmatrix::a_m
private

Definition at line 832 of file matpol.cc.

int mp_permmatrix::a_n
private

Definition at line 832 of file matpol.cc.

int mp_permmatrix::piv_s
private

Definition at line 832 of file matpol.cc.

int * mp_permmatrix::qcol
private

Definition at line 833 of file matpol.cc.

int* mp_permmatrix::qrow
private

Definition at line 833 of file matpol.cc.

int mp_permmatrix::s_m
private

Definition at line 832 of file matpol.cc.

int mp_permmatrix::s_n
private

Definition at line 832 of file matpol.cc.

int mp_permmatrix::sign
private

Definition at line 832 of file matpol.cc.

poly* mp_permmatrix::Xarray
private

Definition at line 834 of file matpol.cc.


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