My Project  UNKNOWN_GIT_VERSION
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 ()
 
poly * mpRowAdr (int r)
 
poly * mpColAdr (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
 
poly * Xarray
 
ring _R
 

Detailed Description

Definition at line 928 of file matpol.cc.

Constructor & Destructor Documentation

◆ mp_permmatrix() [1/3]

mp_permmatrix::mp_permmatrix ( )
inline

Definition at line 945 of file matpol.cc.

945 : a_m(0) {}

◆ mp_permmatrix() [2/3]

mp_permmatrix::mp_permmatrix ( matrix  A,
ring  R 
)

Definition at line 966 of file matpol.cc.

966  : sign(1)
967 {
968  a_m = A->nrows;
969  a_n = A->ncols;
970  this->mpInitMat();
971  Xarray = A->m;
972  _R=R;
973 }
poly * Xarray
Definition: matpol.cc:933
poly * m
Definition: matpol.h:18
#define A
Definition: sirandom.c:23
void mpInitMat()
Definition: matpol.cc:1088
#define R
Definition: sirandom.c:26

◆ mp_permmatrix() [3/3]

mp_permmatrix::mp_permmatrix ( mp_permmatrix M)

Definition at line 975 of file matpol.cc.

976 {
977  poly p, *athis, *aM;
978  int i, j;
979 
980  _R=M->_R;
981  a_m = M->s_m;
982  a_n = M->s_n;
983  sign = M->sign;
984  this->mpInitMat();
985  Xarray = (poly *)omAlloc0(a_m*a_n*sizeof(poly));
986  for (i=a_m-1; i>=0; i--)
987  {
988  athis = this->mpRowAdr(i);
989  aM = M->mpRowAdr(i);
990  for (j=a_n-1; j>=0; j--)
991  {
992  p = aM[M->qcol[j]];
993  if (p)
994  {
995  athis[j] = p_Copy(p,_R);
996  }
997  }
998  }
999 }
int j
Definition: facHensel.cc:105
poly * mpRowAdr(int r)
Definition: matpol.cc:936
static poly p_Copy(poly p, const ring r)
returns a copy of p
Definition: p_polys.h:813
poly * Xarray
Definition: matpol.cc:933
#define M
Definition: sirandom.c:24
int i
Definition: cfEzgcd.cc:125
void mpInitMat()
Definition: matpol.cc:1088
int p
Definition: cfModGcd.cc:4019
#define omAlloc0(size)
Definition: omAllocDecl.h:211

◆ ~mp_permmatrix()

mp_permmatrix::~mp_permmatrix ( )

Definition at line 1001 of file matpol.cc.

1002 {
1003  int k;
1004 
1005  if (a_m != 0)
1006  {
1007  omFreeSize((ADDRESS)qrow,a_m*sizeof(int));
1008  omFreeSize((ADDRESS)qcol,a_n*sizeof(int));
1009  if (Xarray != NULL)
1010  {
1011  for (k=a_m*a_n-1; k>=0; k--)
1012  p_Delete(&Xarray[k],_R);
1013  omFreeSize((ADDRESS)Xarray,a_m*a_n*sizeof(poly));
1014  }
1015  }
1016 }
int * qcol
Definition: matpol.cc:932
#define omFreeSize(addr, size)
Definition: omAllocDecl.h:260
void * ADDRESS
Definition: auxiliary.h:133
int k
Definition: cfEzgcd.cc:92
poly * Xarray
Definition: matpol.cc:933
int * qrow
Definition: matpol.cc:932
static void p_Delete(poly *p, const ring r)
Definition: p_polys.h:858
#define NULL
Definition: omList.c:10

Member Function Documentation

◆ mpColAdr()

poly* mp_permmatrix::mpColAdr ( int  c)
inlineprivate

Definition at line 938 of file matpol.cc.

939  { return &(Xarray[qcol[c]]); }
int * qcol
Definition: matpol.cc:932
poly * Xarray
Definition: matpol.cc:933

◆ mpColReorder()

void mp_permmatrix::mpColReorder ( )

Definition at line 1101 of file matpol.cc.

1102 {
1103  int k, j, j1, j2;
1104 
1105  if (a_n > a_m)
1106  k = a_n - a_m;
1107  else
1108  k = 0;
1109  for (j=a_n-1; j>=k; j--)
1110  {
1111  j1 = qcol[j];
1112  if (j1 != j)
1113  {
1114  this->mpColSwap(j1, j);
1115  j2 = 0;
1116  while (qcol[j2] != j) j2++;
1117  qcol[j2] = j1;
1118  }
1119  }
1120 }
int * qcol
Definition: matpol.cc:932
int j
Definition: facHensel.cc:105
int k
Definition: cfEzgcd.cc:92
void mpColSwap(int, int)
Definition: matpol.cc:1074

◆ mpColSwap()

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

Definition at line 1074 of file matpol.cc.

1075 {
1076  poly p, *a1, *a2;
1077  int i, k = a_n*a_m;
1078 
1079  a1 = &(Xarray[j1]);
1080  a2 = &(Xarray[j2]);
1081  for (i=0; i< k; i+=a_n)
1082  {
1083  p = a1[i];
1084  a1[i] = a2[i];
1085  a2[i] = p;
1086  }
1087 }
int k
Definition: cfEzgcd.cc:92
poly * Xarray
Definition: matpol.cc:933
int i
Definition: cfEzgcd.cc:125
int p
Definition: cfModGcd.cc:4019

◆ mpColWeight()

void mp_permmatrix::mpColWeight ( float *  wcol)
private

Definition at line 1020 of file matpol.cc.

1021 {
1022  poly p, *a;
1023  int i, j;
1024  float count;
1025 
1026  for (j=s_n; j>=0; j--)
1027  {
1028  a = this->mpColAdr(j);
1029  count = 0.0;
1030  for(i=s_m; i>=0; i--)
1031  {
1032  p = a[a_n*qrow[i]];
1033  if (p)
1034  count += mp_PolyWeight(p,_R);
1035  }
1036  wcol[j] = count;
1037  }
1038 }
int status int void size_t count
Definition: si_signals.h:59
int j
Definition: facHensel.cc:105
poly * mpColAdr(int c)
Definition: matpol.cc:938
int i
Definition: cfEzgcd.cc:125
int * qrow
Definition: matpol.cc:932
int p
Definition: cfModGcd.cc:4019
static float mp_PolyWeight(poly p, const ring r)
Definition: matpol.cc:1305

◆ mpDelElem()

void mp_permmatrix::mpDelElem ( int  ,
int   
)

◆ mpElimBareiss()

void mp_permmatrix::mpElimBareiss ( poly  div)

Definition at line 1247 of file matpol.cc.

1248 {
1249  poly piv, elim, q1, q2, *ap, *a;
1250  int i, j, jj;
1251 
1252  ap = this->mpRowAdr(s_m);
1253  piv = ap[qcol[s_n]];
1254  for(i=s_m-1; i>=0; i--)
1255  {
1256  a = this->mpRowAdr(i);
1257  elim = a[qcol[s_n]];
1258  if (elim != NULL)
1259  {
1260  elim = p_Neg(elim,_R);
1261  for (j=s_n-1; j>=0; j--)
1262  {
1263  q2 = NULL;
1264  jj = qcol[j];
1265  if (ap[jj] != NULL)
1266  {
1267  q2 = SM_MULT(ap[jj], elim, div,_R);
1268  if (a[jj] != NULL)
1269  {
1270  q1 = SM_MULT(a[jj], piv, div,_R);
1271  p_Delete(&a[jj],_R);
1272  q2 = p_Add_q(q2, q1, _R);
1273  }
1274  }
1275  else if (a[jj] != NULL)
1276  {
1277  q2 = SM_MULT(a[jj], piv, div, _R);
1278  }
1279  if ((q2!=NULL) && div)
1280  SM_DIV(q2, div, _R);
1281  a[jj] = q2;
1282  }
1283  p_Delete(&a[qcol[s_n]], _R);
1284  }
1285  else
1286  {
1287  for (j=s_n-1; j>=0; j--)
1288  {
1289  jj = qcol[j];
1290  if (a[jj] != NULL)
1291  {
1292  q2 = SM_MULT(a[jj], piv, div, _R);
1293  p_Delete(&a[jj], _R);
1294  if (div)
1295  SM_DIV(q2, div, _R);
1296  a[jj] = q2;
1297  }
1298  }
1299  }
1300  }
1301 }
int * qcol
Definition: matpol.cc:932
int j
Definition: facHensel.cc:105
Definition: ap.h:39
poly * mpRowAdr(int r)
Definition: matpol.cc:936
int i
Definition: cfEzgcd.cc:125
static void p_Delete(poly *p, const ring r)
Definition: p_polys.h:858
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:1044
static poly p_Add_q(poly p, poly q, const ring r)
Definition: p_polys.h:893

◆ mpGetCdim()

int mp_permmatrix::mpGetCdim ( )
inline

Definition at line 952 of file matpol.cc.

952 { return s_n; }

◆ mpGetCol()

int mp_permmatrix::mpGetCol ( )

◆ mpGetElem()

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

Definition at line 1239 of file matpol.cc.

1240 {
1241  return Xarray[a_n*qrow[r]+qcol[c]];
1242 }
int * qcol
Definition: matpol.cc:932
poly * Xarray
Definition: matpol.cc:933
int * qrow
Definition: matpol.cc:932

◆ mpGetRdim()

int mp_permmatrix::mpGetRdim ( )
inline

Definition at line 951 of file matpol.cc.

951 { return s_m; }

◆ mpGetRow()

int mp_permmatrix::mpGetRow ( )

◆ mpGetSign()

int mp_permmatrix::mpGetSign ( )
inline

Definition at line 953 of file matpol.cc.

953 { return sign; }

◆ mpInitMat()

void mp_permmatrix::mpInitMat ( )
private

Definition at line 1088 of file matpol.cc.

1089 {
1090  int k;
1091 
1092  s_m = a_m;
1093  s_n = a_n;
1094  piv_s = 0;
1095  qrow = (int *)omAlloc(a_m*sizeof(int));
1096  qcol = (int *)omAlloc(a_n*sizeof(int));
1097  for (k=a_m-1; k>=0; k--) qrow[k] = k;
1098  for (k=a_n-1; k>=0; k--) qcol[k] = k;
1099 }
int * qcol
Definition: matpol.cc:932
int k
Definition: cfEzgcd.cc:92
#define omAlloc(size)
Definition: omAllocDecl.h:210
int * qrow
Definition: matpol.cc:932

◆ mpPivotBareiss()

int mp_permmatrix::mpPivotBareiss ( row_col_weight C)

Definition at line 1162 of file matpol.cc.

1163 {
1164  poly p, *a;
1165  int i, j, iopt, jopt;
1166  float sum, f1, f2, fo, r, ro, lp;
1167  float *dr = C->wrow, *dc = C->wcol;
1168 
1169  fo = 1.0e20;
1170  ro = 0.0;
1171  iopt = jopt = -1;
1172 
1173  s_n--;
1174  s_m--;
1175  if (s_m == 0)
1176  return 0;
1177  if (s_n == 0)
1178  {
1179  for(i=s_m; i>=0; i--)
1180  {
1181  p = this->mpRowAdr(i)[qcol[0]];
1182  if (p)
1183  {
1184  f1 = mp_PolyWeight(p,_R);
1185  if (f1 < fo)
1186  {
1187  fo = f1;
1188  if (iopt >= 0)
1189  p_Delete(&(this->mpRowAdr(iopt)[qcol[0]]),_R);
1190  iopt = i;
1191  }
1192  else
1193  p_Delete(&(this->mpRowAdr(i)[qcol[0]]),_R);
1194  }
1195  }
1196  if (iopt >= 0)
1197  mpReplace(iopt, s_m, sign, qrow);
1198  return 0;
1199  }
1200  this->mpRowWeight(dr);
1201  this->mpColWeight(dc);
1202  sum = 0.0;
1203  for(i=s_m; i>=0; i--)
1204  sum += dr[i];
1205  for(i=s_m; i>=0; i--)
1206  {
1207  r = dr[i];
1208  a = this->mpRowAdr(i);
1209  for(j=s_n; j>=0; j--)
1210  {
1211  p = a[qcol[j]];
1212  if (p)
1213  {
1214  lp = mp_PolyWeight(p,_R);
1215  ro = r - lp;
1216  f1 = ro * (dc[j]-lp);
1217  if (f1 != 0.0)
1218  {
1219  f2 = lp * (sum - ro - dc[j]);
1220  f2 += f1;
1221  }
1222  else
1223  f2 = lp-r-dc[j];
1224  if (f2 < fo)
1225  {
1226  fo = f2;
1227  iopt = i;
1228  jopt = j;
1229  }
1230  }
1231  }
1232  }
1233  if (iopt < 0)
1234  return 0;
1235  mpReplace(iopt, s_m, sign, qrow);
1236  mpReplace(jopt, s_n, sign, qcol);
1237  return 1;
1238 }
int * qcol
Definition: matpol.cc:932
int j
Definition: facHensel.cc:105
float * wcol
Definition: matpol.cc:896
void mpColWeight(float *)
Definition: matpol.cc:1020
void mpRowWeight(float *)
Definition: matpol.cc:1039
poly * mpRowAdr(int r)
Definition: matpol.cc:936
static void mpReplace(int j, int n, int &sign, int *perm)
Definition: matpol.cc:1147
float * wrow
Definition: matpol.cc:896
int i
Definition: cfEzgcd.cc:125
int * qrow
Definition: matpol.cc:932
static void p_Delete(poly *p, const ring r)
Definition: p_polys.h:858
int p
Definition: cfModGcd.cc:4019
static float mp_PolyWeight(poly p, const ring r)
Definition: matpol.cc:1305

◆ mpPivotRow()

int mp_permmatrix::mpPivotRow ( row_col_weight ,
int   
)

◆ mpRowAdr()

poly* mp_permmatrix::mpRowAdr ( int  r)
inlineprivate

Definition at line 936 of file matpol.cc.

937  { return &(Xarray[a_n*qrow[r]]); }
poly * Xarray
Definition: matpol.cc:933
int * qrow
Definition: matpol.cc:932

◆ mpRowReorder()

void mp_permmatrix::mpRowReorder ( )

Definition at line 1122 of file matpol.cc.

1123 {
1124  int k, i, i1, i2;
1125 
1126  if (a_m > a_n)
1127  k = a_m - a_n;
1128  else
1129  k = 0;
1130  for (i=a_m-1; i>=k; i--)
1131  {
1132  i1 = qrow[i];
1133  if (i1 != i)
1134  {
1135  this->mpRowSwap(i1, i);
1136  i2 = 0;
1137  while (qrow[i2] != i) i2++;
1138  qrow[i2] = i1;
1139  }
1140  }
1141 }
void mpRowSwap(int, int)
Definition: matpol.cc:1059
int k
Definition: cfEzgcd.cc:92
int i
Definition: cfEzgcd.cc:125
int * qrow
Definition: matpol.cc:932

◆ mpRowSwap()

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

Definition at line 1059 of file matpol.cc.

1060 {
1061  poly p, *a1, *a2;
1062  int j;
1063 
1064  a1 = &(Xarray[a_n*i1]);
1065  a2 = &(Xarray[a_n*i2]);
1066  for (j=a_n-1; j>= 0; j--)
1067  {
1068  p = a1[j];
1069  a1[j] = a2[j];
1070  a2[j] = p;
1071  }
1072 }
int j
Definition: facHensel.cc:105
poly * Xarray
Definition: matpol.cc:933
int p
Definition: cfModGcd.cc:4019

◆ mpRowWeight()

void mp_permmatrix::mpRowWeight ( float *  wrow)
private

Definition at line 1039 of file matpol.cc.

1040 {
1041  poly p, *a;
1042  int i, j;
1043  float count;
1044 
1045  for (i=s_m; i>=0; i--)
1046  {
1047  a = this->mpRowAdr(i);
1048  count = 0.0;
1049  for(j=s_n; j>=0; j--)
1050  {
1051  p = a[qcol[j]];
1052  if (p)
1053  count += mp_PolyWeight(p,_R);
1054  }
1055  wrow[i] = count;
1056  }
1057 }
int status int void size_t count
Definition: si_signals.h:59
int * qcol
Definition: matpol.cc:932
int j
Definition: facHensel.cc:105
poly * mpRowAdr(int r)
Definition: matpol.cc:936
int i
Definition: cfEzgcd.cc:125
int p
Definition: cfModGcd.cc:4019
static float mp_PolyWeight(poly p, const ring r)
Definition: matpol.cc:1305

◆ mpSaveArray()

void mp_permmatrix::mpSaveArray ( )
inline

Definition at line 955 of file matpol.cc.

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

◆ a_m

int mp_permmatrix::a_m
private

Definition at line 931 of file matpol.cc.

◆ a_n

int mp_permmatrix::a_n
private

Definition at line 931 of file matpol.cc.

◆ piv_s

int mp_permmatrix::piv_s
private

Definition at line 931 of file matpol.cc.

◆ qcol

int * mp_permmatrix::qcol
private

Definition at line 932 of file matpol.cc.

◆ qrow

int* mp_permmatrix::qrow
private

Definition at line 932 of file matpol.cc.

◆ s_m

int mp_permmatrix::s_m
private

Definition at line 931 of file matpol.cc.

◆ s_n

int mp_permmatrix::s_n
private

Definition at line 931 of file matpol.cc.

◆ sign

int mp_permmatrix::sign
private

Definition at line 931 of file matpol.cc.

◆ Xarray

poly* mp_permmatrix::Xarray
private

Definition at line 933 of file matpol.cc.


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