My Project
Loading...
Searching...
No Matches
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 919 of file matpol.cc.

Constructor & Destructor Documentation

◆ mp_permmatrix() [1/3]

mp_permmatrix::mp_permmatrix ( )
inline

Definition at line 936 of file matpol.cc.

936: a_m(0) {}

◆ mp_permmatrix() [2/3]

mp_permmatrix::mp_permmatrix ( matrix A,
ring R )

Definition at line 957 of file matpol.cc.

957 : sign(1)
958{
959 a_m = A->nrows;
960 a_n = A->ncols;
961 this->mpInitMat();
962 Xarray = A->m;
963 _R=R;
964}
poly * Xarray
Definition matpol.cc:924
void mpInitMat()
Definition matpol.cc:1079
#define R
Definition sirandom.c:27
#define A
Definition sirandom.c:24

◆ mp_permmatrix() [3/3]

mp_permmatrix::mp_permmatrix ( mp_permmatrix * M)

Definition at line 966 of file matpol.cc.

967{
968 poly p, *athis, *aM;
969 int i, j;
970
971 _R=M->_R;
972 a_m = M->s_m;
973 a_n = M->s_n;
974 sign = M->sign;
975 this->mpInitMat();
976 Xarray = (poly *)omAlloc0(a_m*a_n*sizeof(poly));
977 for (i=a_m-1; i>=0; i--)
978 {
979 athis = this->mpRowAdr(i);
980 aM = M->mpRowAdr(i);
981 for (j=a_n-1; j>=0; j--)
982 {
983 p = aM[M->qcol[j]];
984 if (p)
985 {
986 athis[j] = p_Copy(p,_R);
987 }
988 }
989 }
990}
int i
Definition cfEzgcd.cc:132
int p
Definition cfModGcd.cc:4086
poly * mpRowAdr(int r)
Definition matpol.cc:927
int j
Definition facHensel.cc:110
#define omAlloc0(size)
static poly p_Copy(poly p, const ring r)
returns a copy of p
Definition p_polys.h:848
#define M
Definition sirandom.c:25

◆ ~mp_permmatrix()

mp_permmatrix::~mp_permmatrix ( )

Definition at line 992 of file matpol.cc.

993{
994 int k;
995
996 if (a_m != 0)
997 {
998 omFreeSize((ADDRESS)qrow,a_m*sizeof(int));
999 omFreeSize((ADDRESS)qcol,a_n*sizeof(int));
1000 if (Xarray != NULL)
1001 {
1002 for (k=a_m*a_n-1; k>=0; k--)
1003 p_Delete(&Xarray[k],_R);
1004 omFreeSize((ADDRESS)Xarray,a_m*a_n*sizeof(poly));
1005 }
1006 }
1007}
void * ADDRESS
Definition auxiliary.h:120
int k
Definition cfEzgcd.cc:99
#define omFreeSize(addr, size)
#define NULL
Definition omList.c:12
static void p_Delete(poly *p, const ring r)
Definition p_polys.h:903

Member Function Documentation

◆ mpColAdr()

poly * mp_permmatrix::mpColAdr ( int c)
inlineprivate

Definition at line 929 of file matpol.cc.

930 { return &(Xarray[qcol[c]]); }

◆ mpColReorder()

void mp_permmatrix::mpColReorder ( )

Definition at line 1092 of file matpol.cc.

1093{
1094 int k, j, j1, j2;
1095
1096 if (a_n > a_m)
1097 k = a_n - a_m;
1098 else
1099 k = 0;
1100 for (j=a_n-1; j>=k; j--)
1101 {
1102 j1 = qcol[j];
1103 if (j1 != j)
1104 {
1105 this->mpColSwap(j1, j);
1106 j2 = 0;
1107 while (qcol[j2] != j) j2++;
1108 qcol[j2] = j1;
1109 }
1110 }
1111}
void mpColSwap(int, int)
Definition matpol.cc:1065

◆ mpColSwap()

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

Definition at line 1065 of file matpol.cc.

1066{
1067 poly p, *a1, *a2;
1068 int i, k = a_n*a_m;
1069
1070 a1 = &(Xarray[j1]);
1071 a2 = &(Xarray[j2]);
1072 for (i=0; i< k; i+=a_n)
1073 {
1074 p = a1[i];
1075 a1[i] = a2[i];
1076 a2[i] = p;
1077 }
1078}

◆ mpColWeight()

void mp_permmatrix::mpColWeight ( float * wcol)
private

Definition at line 1011 of file matpol.cc.

1012{
1013 poly p, *a;
1014 int i, j;
1015 float count;
1016
1017 for (j=s_n; j>=0; j--)
1018 {
1019 a = this->mpColAdr(j);
1020 count = 0.0;
1021 for(i=s_m; i>=0; i--)
1022 {
1023 p = a[a_n*qrow[i]];
1024 if (p)
1025 count += mp_PolyWeight(p,_R);
1026 }
1027 wcol[j] = count;
1028 }
1029}
poly * mpColAdr(int c)
Definition matpol.cc:929
static float mp_PolyWeight(poly p, const ring r)
Definition matpol.cc:1296
int status int void size_t count
Definition si_signals.h:69

◆ mpDelElem()

void mp_permmatrix::mpDelElem ( int ,
int  )

◆ mpElimBareiss()

void mp_permmatrix::mpElimBareiss ( poly div)

Definition at line 1238 of file matpol.cc.

1239{
1240 poly piv, elim, q1, q2, *ap, *a;
1241 int i, j, jj;
1242
1243 ap = this->mpRowAdr(s_m);
1244 piv = ap[qcol[s_n]];
1245 for(i=s_m-1; i>=0; i--)
1246 {
1247 a = this->mpRowAdr(i);
1248 elim = a[qcol[s_n]];
1249 if (elim != NULL)
1250 {
1251 elim = p_Neg(elim,_R);
1252 for (j=s_n-1; j>=0; j--)
1253 {
1254 q2 = NULL;
1255 jj = qcol[j];
1256 if (ap[jj] != NULL)
1257 {
1258 q2 = SM_MULT(ap[jj], elim, div,_R);
1259 if (a[jj] != NULL)
1260 {
1261 q1 = SM_MULT(a[jj], piv, div,_R);
1262 p_Delete(&a[jj],_R);
1263 q2 = p_Add_q(q2, q1, _R);
1264 }
1265 }
1266 else if (a[jj] != NULL)
1267 {
1268 q2 = SM_MULT(a[jj], piv, div, _R);
1269 }
1270 if ((q2!=NULL) && div)
1271 SM_DIV(q2, div, _R);
1272 a[jj] = q2;
1273 }
1274 p_Delete(&a[qcol[s_n]], _R);
1275 }
1276 else
1277 {
1278 for (j=s_n-1; j>=0; j--)
1279 {
1280 jj = qcol[j];
1281 if (a[jj] != NULL)
1282 {
1283 q2 = SM_MULT(a[jj], piv, div, _R);
1284 p_Delete(&a[jj], _R);
1285 if (div)
1286 SM_DIV(q2, div, _R);
1287 a[jj] = q2;
1288 }
1289 }
1290 }
1291 }
1292}
CF_NO_INLINE FACTORY_PUBLIC CanonicalForm div(const CanonicalForm &, const CanonicalForm &)
static poly p_Neg(poly p, const ring r)
Definition p_polys.h:1109
static poly p_Add_q(poly p, poly q, const ring r)
Definition p_polys.h:938
#define SM_DIV
Definition sparsmat.h:24
#define SM_MULT
Definition sparsmat.h:23

◆ mpGetCdim()

int mp_permmatrix::mpGetCdim ( )
inline

Definition at line 943 of file matpol.cc.

943{ return s_n; }

◆ mpGetCol()

int mp_permmatrix::mpGetCol ( )

◆ mpGetElem()

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

Definition at line 1230 of file matpol.cc.

1231{
1232 return Xarray[a_n*qrow[r]+qcol[c]];
1233}

◆ mpGetRdim()

int mp_permmatrix::mpGetRdim ( )
inline

Definition at line 942 of file matpol.cc.

942{ return s_m; }

◆ mpGetRow()

int mp_permmatrix::mpGetRow ( )

◆ mpGetSign()

int mp_permmatrix::mpGetSign ( )
inline

Definition at line 944 of file matpol.cc.

944{ return sign; }

◆ mpInitMat()

void mp_permmatrix::mpInitMat ( )
private

Definition at line 1079 of file matpol.cc.

1080{
1081 int k;
1082
1083 s_m = a_m;
1084 s_n = a_n;
1085 piv_s = 0;
1086 qrow = (int *)omAlloc(a_m*sizeof(int));
1087 qcol = (int *)omAlloc(a_n*sizeof(int));
1088 for (k=a_m-1; k>=0; k--) qrow[k] = k;
1089 for (k=a_n-1; k>=0; k--) qcol[k] = k;
1090}
#define omAlloc(size)

◆ mpPivotBareiss()

int mp_permmatrix::mpPivotBareiss ( row_col_weight * C)

Definition at line 1153 of file matpol.cc.

1154{
1155 poly p, *a;
1156 int i, j, iopt, jopt;
1157 float sum, f1, f2, fo, r, ro, lp;
1158 float *dr = C->wrow, *dc = C->wcol;
1159
1160 fo = 1.0e20;
1161 ro = 0.0;
1162 iopt = jopt = -1;
1163
1164 s_n--;
1165 s_m--;
1166 if (s_m == 0)
1167 return 0;
1168 if (s_n == 0)
1169 {
1170 for(i=s_m; i>=0; i--)
1171 {
1172 p = this->mpRowAdr(i)[qcol[0]];
1173 if (p)
1174 {
1175 f1 = mp_PolyWeight(p,_R);
1176 if (f1 < fo)
1177 {
1178 fo = f1;
1179 if (iopt >= 0)
1180 p_Delete(&(this->mpRowAdr(iopt)[qcol[0]]),_R);
1181 iopt = i;
1182 }
1183 else
1184 p_Delete(&(this->mpRowAdr(i)[qcol[0]]),_R);
1185 }
1186 }
1187 if (iopt >= 0)
1188 mpReplace(iopt, s_m, sign, qrow);
1189 return 0;
1190 }
1191 this->mpRowWeight(dr);
1192 this->mpColWeight(dc);
1193 sum = 0.0;
1194 for(i=s_m; i>=0; i--)
1195 sum += dr[i];
1196 for(i=s_m; i>=0; i--)
1197 {
1198 r = dr[i];
1199 a = this->mpRowAdr(i);
1200 for(j=s_n; j>=0; j--)
1201 {
1202 p = a[qcol[j]];
1203 if (p)
1204 {
1205 lp = mp_PolyWeight(p,_R);
1206 ro = r - lp;
1207 f1 = ro * (dc[j]-lp);
1208 if (f1 != 0.0)
1209 {
1210 f2 = lp * (sum - ro - dc[j]);
1211 f2 += f1;
1212 }
1213 else
1214 f2 = lp-r-dc[j];
1215 if (f2 < fo)
1216 {
1217 fo = f2;
1218 iopt = i;
1219 jopt = j;
1220 }
1221 }
1222 }
1223 }
1224 if (iopt < 0)
1225 return 0;
1226 mpReplace(iopt, s_m, sign, qrow);
1227 mpReplace(jopt, s_n, sign, qcol);
1228 return 1;
1229}
void mpColWeight(float *)
Definition matpol.cc:1011
void mpRowWeight(float *)
Definition matpol.cc:1030
float * wcol
Definition matpol.cc:887
float * wrow
Definition matpol.cc:887
static void mpReplace(int j, int n, int &sign, int *perm)
Definition matpol.cc:1138

◆ mpPivotRow()

int mp_permmatrix::mpPivotRow ( row_col_weight * ,
int  )

◆ mpRowAdr()

poly * mp_permmatrix::mpRowAdr ( int r)
inlineprivate

Definition at line 927 of file matpol.cc.

928 { return &(Xarray[a_n*qrow[r]]); }

◆ mpRowReorder()

void mp_permmatrix::mpRowReorder ( )

Definition at line 1113 of file matpol.cc.

1114{
1115 int k, i, i1, i2;
1116
1117 if (a_m > a_n)
1118 k = a_m - a_n;
1119 else
1120 k = 0;
1121 for (i=a_m-1; i>=k; i--)
1122 {
1123 i1 = qrow[i];
1124 if (i1 != i)
1125 {
1126 this->mpRowSwap(i1, i);
1127 i2 = 0;
1128 while (qrow[i2] != i) i2++;
1129 qrow[i2] = i1;
1130 }
1131 }
1132}
void mpRowSwap(int, int)
Definition matpol.cc:1050

◆ mpRowSwap()

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

Definition at line 1050 of file matpol.cc.

1051{
1052 poly p, *a1, *a2;
1053 int j;
1054
1055 a1 = &(Xarray[a_n*i1]);
1056 a2 = &(Xarray[a_n*i2]);
1057 for (j=a_n-1; j>= 0; j--)
1058 {
1059 p = a1[j];
1060 a1[j] = a2[j];
1061 a2[j] = p;
1062 }
1063}

◆ mpRowWeight()

void mp_permmatrix::mpRowWeight ( float * wrow)
private

Definition at line 1030 of file matpol.cc.

1031{
1032 poly p, *a;
1033 int i, j;
1034 float count;
1035
1036 for (i=s_m; i>=0; i--)
1037 {
1038 a = this->mpRowAdr(i);
1039 count = 0.0;
1040 for(j=s_n; j>=0; j--)
1041 {
1042 p = a[qcol[j]];
1043 if (p)
1044 count += mp_PolyWeight(p,_R);
1045 }
1046 wrow[i] = count;
1047 }
1048}

◆ mpSaveArray()

void mp_permmatrix::mpSaveArray ( )
inline

Definition at line 946 of file matpol.cc.

946{ Xarray = NULL; }

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

◆ a_m

int mp_permmatrix::a_m
private

Definition at line 922 of file matpol.cc.

◆ a_n

int mp_permmatrix::a_n
private

Definition at line 922 of file matpol.cc.

◆ piv_s

int mp_permmatrix::piv_s
private

Definition at line 922 of file matpol.cc.

◆ qcol

int * mp_permmatrix::qcol
private

Definition at line 923 of file matpol.cc.

◆ qrow

int* mp_permmatrix::qrow
private

Definition at line 923 of file matpol.cc.

◆ s_m

int mp_permmatrix::s_m
private

Definition at line 922 of file matpol.cc.

◆ s_n

int mp_permmatrix::s_n
private

Definition at line 922 of file matpol.cc.

◆ sign

int mp_permmatrix::sign
private

Definition at line 922 of file matpol.cc.

◆ Xarray

poly* mp_permmatrix::Xarray
private

Definition at line 924 of file matpol.cc.


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