2 #ifndef COIN_OSL_C_INCLUDE
9 #define COIN_OSL_C_INCLUDE
14 #define C_EKK_GO_SPARSE 200
18 #if __BYTE_ORDER == __LITTLE_ENDIAN
39 int * mpt,
int first_nonzero);
42 int * mpt,
int ipivrw,
int * spare);
46 int *mpt2,
double dalpha,
int orig_nincol,
47 int npivot,
int *nuspikp,
48 const int ipivrw,
int * spare);
51 double * dpermu,
int * mpt,
int numberNonZero);
54 double *dwork1,
int *mpt,
int *nincolp);
56 double * dpermu1,
int * mpt1,
int *nincolp,
57 double *dwork1_ft,
int *mpt_ft,
int *nincolp_ft);
61 inline void c_ekkscpy(
int n,
const int *marr1,
int *marr2)
63 inline void c_ekkdcpy(
int n,
const double *marr1,
double *marr2)
69 void c_ekkzero(
int length,
int n,
void * array);
80 #define c_ekkscpy_0_1(s,ival,array) CoinFillN(array,s,ival)
81 #define c_ekks1cpy( n,marr1,marr2) CoinMemcpyN(marr1,n, marr2)
85 int *
clp_int(
int number_entries);
89 #define SLACK_VALUE -1.0
90 #define C_EKK_REMOVE_LINK(hpiv,hin,link,ipivot) \
92 int ipre = link[ipivot].pre; \
93 int isuc = link[ipivot].suc; \
95 link[ipre].suc = isuc; \
98 hpiv[hin[ipivot]] = isuc; \
101 link[isuc].pre = ipre; \
105 #define C_EKK_ADD_LINK(hpiv,nzi,link, npr) \
107 int ifiri = hpiv[nzi]; \
109 link[npr].suc = ifiri; \
112 link[ifiri].pre = npr; \
118 #define SHIFT_INDEX(limit) (limit)
119 #define UNSHIFT_INDEX(limit) (limit)
120 #define SHIFT_REF(arr,ind) (arr)[ind]
124 #define SHIFT_INDEX(limit) ((limit)<<3)
125 #define UNSHIFT_INDEX(limit) ((unsigned int)(limit)>>3)
126 #define SHIFT_REF(arr,ind) (*(double*)((char*)(arr) + (ind)))
131 #define NOT_ZERO(x) (((*((reinterpret_cast<unsigned char *>(&x))+7)) & 0x7F) != 0)
133 #define NOT_ZERO(x) ((x) != 0.0)
136 #define SWAP(type,_x,_y) { type _tmp = (_x); (_x) = (_y); (_y) = _tmp;}
138 #define UNROLL_LOOP_BODY1(code) \
140 #define UNROLL_LOOP_BODY2(code) \
142 #define UNROLL_LOOP_BODY4(code) \
143 {{code} {code} {code} {code}}
153 int *hcoli = fact->xecadr;
154 double *dluval = fact->xeeadr;
155 double *dvalpv = fact->kw3adr;
156 int *mrstrt = fact->xrsadr;
157 int *hrowi = fact->xeradr;
158 int *mcstrt = fact->xcsadr;
159 int *hinrow = fact->xrnadr;
160 int *hincol = fact->xcnadr;
161 int *hpivro = fact->krpadr;
162 int *hpivco = fact->kcpadr;
164 int nnentl = fact->nnentl;
165 int nnentu = fact->nnentu;
166 int kmxeta = fact->kmxeta;
167 int xnewro = *xnewrop;
168 int ncompactions = *ncompactionsp;
170 MACTION_T *maction =
reinterpret_cast<MACTION_T*
>(maction_void);
175 int jj, kk, kr, nz, jj1, jj2, kce, kcs, kqq, npr;
179 int knpr, irow, iadd32, ibase;
185 int kipie, kcpiv, knprs, knpre;
187 double multip, elemnt;
188 int ipivot, jpivot, epivro, epivco, lstart, nfirst;
189 int nzpivj, kfill, kstart;
193 int noRoomForDense=0;
194 int if_sparse_update=fact->if_sparse_update;
198 const int nrow = fact->nrow;
204 lstart = nnetas - nnentl + 1;
205 for (i = lstart; i <= nnetas; ++i) {
209 for (i = 1; i <= nrow; ++i) {
211 mwork[i].pre = i - 1;
212 mwork[i].suc = i + 1;
221 for (count = 1; count <= nrow; ++count) {
224 if (! (hpivco[1] <= 0)) {
225 int small_pivot = c_ekkcsin(fact,
231 if (fact->invok >= 0) {
235 if (fact->npivots >= nrow) {
241 if (! (hpivro[1] <= 0)) {
242 irtcod = c_ekkrsin(fact,
249 &kmxeta, &ncompactions,
252 if (irtcod < 0 || fact->invok >= 0) {
259 if (fact->npivots >= nrow) {
262 lstart = nnetas - nnentl + 1;
266 irtcod = c_ekkfpvt(fact,
268 nsingp, xrejctp, &ipivot, &jpivot);
274 c_ekkprpv(fact, rlink, clink,
275 *xrejctp, ipivot, jpivot);
277 epivco = hincol[jpivot];
279 mcstrt[fact->xnetal] = lstart - 1;
280 hpivco[fact->xnetal] = ipivot;
281 epivro = hinrow[ipivot];
283 kipis = mrstrt[ipivot];
284 pivot = dluval[kipis];
286 kipie = kipis + epivr1;
290 double size = nrow - fact->npivots;
291 if (size > GO_DENSE && (nnentu - fact->nuspike) * GO_DENSE_RATIO > size * size) {
302 for (k = kipis; k <= kipie; ++k) {
304 dvalpv[k - kipis + 1] = dluval[k];
305 maction[irow] =
static_cast<MACTION_T
>(k - kipis + 1);
309 kcpiv = mcstrt[jpivot] - 1;
310 for (nzpivj = 1; nzpivj <= epivco; ++nzpivj) {
323 knpre = knprs + enpr;
329 if (jpivot == hcoli[knpr]) {
336 multip = -dluval[knpr] * dpivx;
339 dluval[knpr] = dluval[knpre];
340 hcoli[knpr] = hcoli[knpre];
345 kfill = epivr1 - (knpre - knprs + 1);
346 nres = ((knpre - knprs + 1) & 1) + knprs;
353 if (maction[j] == 0) {
357 maction[j] =
static_cast<MACTION_T
>(-maction[j]);
358 dluval[knprs] += multip * dvalpv[jj];
359 d1 = fabs(dluval[knprs]);
362 j2 = hcoli[nres + 1];
364 for (kr = nres; kr < knpre; kr += 2) {
369 maction[j1] =
static_cast<MACTION_T
>(-maction[j1]);
370 dluval[kr] += multip * dvalpv[jj1];
371 cancel = cancel || ! (fact->zeroTolerance < d1);
372 d1 = fabs(dluval[kr]);
378 maction[j2] =
static_cast<MACTION_T
>(-maction[j2]);
379 dluval[kr + 1] += multip * dvalpv[jj2];
380 cancel = cancel || ! (fact->zeroTolerance < d1);
381 d1 = fabs(dluval[kr + 1]);
386 cancel = cancel || ! (fact->zeroTolerance < d1);
403 kfill = epivr1 - (knpre - knprs + 1);
406 for (kr = knprs; kr <= knpre; kr++) {
414 maction[j1] = -maction[j1];
415 dluval[kr] += multip * dvalpv[jj1];
416 d1 = fabs(dluval[kr]);
417 cancel = cancel || ! (fact->zeroTolerance < d1);
427 for (kr = knprs; kr <= knpre; ++kr) {
429 if (fabs(dluval[kr]) > fact->zeroTolerance) {
431 dluval[kstart] = dluval[kr];
439 kce = kcs + hincol[j];
440 for (kk = kcs; kk <= kce; ++kk) {
441 if (hrowi[kk] == npr) {
442 hrowi[kk] = hrowi[kce];
454 for (k = kipis; k <= kipie; ++k) {
455 maction[hcoli[k]] =
static_cast<MACTION_T
>(-maction[hcoli[k]]);
459 naft = mwork[npr].suc;
460 kqq = mrstrt[naft] - knpre - 1;
466 if (! (xnewro + nznpr + 1 < lstart)) {
467 if (! (nnentu + nznpr + 1 < lstart)) {
477 int iput = c_ekkrwcs(fact,dluval, hcoli, mrstrt, hinrow, mwork, nfirst);
478 kmxeta += xnewro - iput ;
483 kipis = mrstrt[ipivot] + 1;
484 kipie = kipis + epivr1 - 1;
491 knpre = knprs + enpr - 1;
499 npre = mwork[npr].pre;
504 mwork[naft].pre = npre;
505 mwork[npre].suc = naft;
507 mwork[nfirst].pre = npr;
508 mwork[nlast].suc = npr;
509 mwork[npr].pre = nlast;
510 mwork[npr].suc = nfirst;
513 mrstrt[npr] = kstart + 1;
514 nmove = knpre - knprs + 1;
515 ibase = kstart + 1 - knprs;
516 for (kr = knprs; kr <= knpre; ++kr) {
517 dluval[ibase + kr] = dluval[kr];
518 hcoli[ibase + kr] = hcoli[kr];
539 if (kstart + (nrow << 1) + 100 < lstart) {
540 ileft = ((nrow - fact->npivots + 32) & -32);
541 if (kstart + ileft * ileft + 32 < lstart) {
543 xnewro =
CoinMax(kstart,xnewro);
544 xnewro = (xnewro & -32) + ileft;
546 xnewro = ((kstart + 31) & -32);
554 }
else if (! (nnentu + kqq + 2 < lstart)) {
559 for (kr = kipis; kr <= kipie; ++kr) {
563 elemnt = multip * dvalpv[jj];
564 if (fabs(elemnt) > fact->zeroTolerance) {
566 dluval[kstart] = elemnt;
575 if (xnewco + 1 >= lstart) {
576 if (xnewco + nz + 1 >= lstart) {
578 if (nnentu + nz + 1 < lstart) {
579 xnewco = c_ekkclco(fact,hrowi, mcstrt, hincol, xnewco);
582 kcpiv = mcstrt[jpivot] - 1;
593 mcstrt[j] = xnewco + 1;
594 ibase = mcstrt[j] - kcs;
595 for (kk = kcs; kk <= kce; ++kk) {
596 hrowi[ibase + kk] = hrowi[kk];
599 kce = xnewco + kce - kcs + 1;
604 }
else if (hrowi[kce + 1] != 0) {
606 if (xnewco + nz + 1 >= lstart) {
608 if (nnentu + nz + 1 < lstart) {
609 xnewco = c_ekkclco(fact,hrowi, mcstrt, hincol, xnewco);
612 kcpiv = mcstrt[jpivot] - 1;
623 mcstrt[j] = xnewco + 1;
624 ibase = mcstrt[j] - kcs;
625 for (kk = kcs; kk <= kce; ++kk) {
626 hrowi[ibase + kk] = hrowi[kk];
629 kce = xnewco + kce - kcs + 1;
633 hrowi[kce + 1] = npr;
637 maction[j] =
static_cast<MACTION_T
>(-maction[j]);
644 hinrow[npr] = kstart - mrstrt[npr] + 1;
646 if (! (xnewco + 1 < lstart)) {
647 xnewco = c_ekkclco(fact,hrowi, mcstrt, hincol, xnewco);
650 kcpiv = mcstrt[jpivot] - 1;
652 if (! (xnewro + 1 < lstart)) {
653 int iput = c_ekkrwcs(fact,dluval, hcoli, mrstrt, hinrow, mwork, nfirst);
654 kmxeta += xnewro - iput ;
658 kipis = mrstrt[ipivot] + 1;
659 kipie = kipis + epivr1 - 1;
665 dluval[lstart] = multip;
668 #define INLINE_AFPV 3
689 double d = fabs(els[j]);
699 double maxaij=fabs(els[0]);
700 for (j=1;j<nel;j++) {
701 double d = fabs(els[j]);
719 double d = fabs(els[j]);
728 SWAP(
int, index[koff], index[0]);
729 SWAP(
double, els[koff], els[0]);
734 int nzi = hinrow[npr];
743 int nn = mcstrt[fact->xnetal] - lstart + 1;
744 c_ekkafpv(hrowi+lstart, hcoli, dluval, mrstrt, hinrow, nn);
748 for (k = kipis; k <= kipie; ++k) {
749 maction[hcoli[k]] = 0;
753 for (k = kipis; k <= kipie; ++k) {
757 ! ((clink[j].pre > nrow && nzj != 1))) {
762 for (k = kipis; k <= kipie; ++k) {
770 fact->nuspike += hinrow[ipivot];
775 int ndense = nrow - fact->npivots;
776 if (! (xnewro + ndense * ndense >= lstart)) {
779 c_ekkizero( nrow, reinterpret_cast<int *> (maction+1));
781 for (i = 1; i <= nrow; ++i) {
782 if (clink[i].pre >= 0) {
784 maction[i] =
static_cast<short int>(iput);
789 for (i = 1; i <= nrow; ++i) {
790 if (rlink[i].pre >= 0) {
791 nspare = nspare + ndense - hinrow[i];
794 if (iput != nrow - fact->npivots) {
796 c_ekkizero( nrow, reinterpret_cast<int *> (maction+1));
799 int iput = c_ekkrwcs(fact,dluval, hcoli, mrstrt, hinrow, mwork, nfirst);
800 kmxeta += xnewro - iput ;
805 if (xnewro + nspare + ndense * ndense >= lstart) {
806 c_ekkizero( nrow, reinterpret_cast<int *> (maction+1));
810 c_ekkrwct(fact,dluval, hcoli, mrstrt, hinrow, mwork,
811 rlink, maction, dvalpv,
814 if (nnentu + nnentl > nrow * 5 &&
815 (ndense*ndense)>(nnentu+nnentl)>>2 &&
817 fact->ndenuc = ndense;
819 irtcod = c_ekkcmfd(fact,
820 (reinterpret_cast<int*>(dvalpv)+1),
822 (reinterpret_cast<int*>(maction+1))+1,
836 if (!noRoomForDense) {
837 int etasize =
CoinMax(4*fact->nnentu+(nnetas-fact->nnentl)+1000,fact->eta_size);
838 noRoomForDense=ndense;
839 fact->eta_size=
CoinMin(static_cast<int>(1.2*fact->eta_size),etasize);
840 if (fact->maxNNetas>0&&fact->eta_size>
842 fact->eta_size=fact->maxNNetas;
853 int iput = c_ekkrwcs(fact,dluval, hcoli, mrstrt, hinrow, mwork, nfirst);
854 kmxeta += xnewro - iput;
861 mwork[nrow+1].pre = nfirst;
862 mwork[nrow+1].suc = nlast;
864 fact->nnentl = nnentl;
865 fact->nnentu = nnentu;
866 fact->kmxeta = kmxeta;
868 *ncompactionsp = ncompactions;
int c_ekkbtrn_ipivrw(register const EKKfactinfo *fact, double *dwork1, int *mpt, int ipivrw, int *spare)
void clp_free(void *oldArray)
#define SHIFT_INDEX(limit)
void c_ekkczero(int n, char *marray)
double * clp_double(int number_entries)
T CoinMax(register const T x1, register const T x2)
Return the larger (according to operator<() of the arguments.
#define C_EKK_ADD_LINK(hpiv, nzi, link, npr)
void c_ekkdcpy(int n, const double *marr1, double *marr2)
void c_ekkizero(int n, int *marray)
void CoinZeroN(register T *to, const int size)
This helper function fills an array with zero.
int c_ekklfct(register EKKfactinfo *fact)
int * clp_int(int number_entries)
void clp_memory(int type)
int c_ekk_IsSet(const int *array, int bit)
int c_ekketsj(registerEKKfactinfo *fact, double *dwork1, int *mpt2, double dalpha, int orig_nincol, int npivot, int *nuspikp, const int ipivrw, int *spare)
void c_ekk_Unset(int *array, int bit)
void c_ekkftrn2(register EKKfactinfo *fact, double *dwork1, double *dpermu1, int *mpt1, int *nincolp, double *dwork1_ft, int *mpt_ft, int *nincolp_ft)
#define SWAP(type, _x, _y)
void CoinMemcpyN(register const T *from, const int size, register T *to)
This helper function copies an array to another location.
void * clp_malloc(int number_entries)
void c_ekkzero(int length, int n, void *array)
#define UNROLL_LOOP_BODY2(code)
void c_ekkscpy(int n, const int *marr1, int *marr2)
int c_ekkftrn(register const EKKfactinfo *fact, double *dwork1, double *dpermu, int *mpt, int numberNonZero)
int c_ekkslcf(register const EKKfactinfo *fact)
void c_ekk_Set(int *array, int bit)
void clp_setup_pointers(EKKfactinfo *fact)
T CoinMin(register const T x1, register const T x2)
Return the smaller (according to operator<() of the arguments.
int c_ekkbtrn(register const EKKfactinfo *fact, double *dwork1, int *mpt, int first_nonzero)
#define UNROLL_LOOP_BODY4(code)
void c_ekkdzero(int n, double *marray)
int c_ekkftrn_ft(register EKKfactinfo *fact, double *dwork1, int *mpt, int *nincolp)