//pind is a vector of length m of dimensions //the dimensions in pind are in an increasing order LPTable Table::Reduce(int m, int* pind) { int i; LPTable newtab; LPTable oldtab; if(m == 0) { return NULL; } newtab = ReduceOne(pind[m-1]); if(m == 1) { return newtab; } for(i=m-2; i>=0; i--) { oldtab = newtab; newtab = oldtab->ReduceOne(pind[i]); oldtab->Reset(); delete oldtab; } return newtab; }
LPTable ReduceOneShuttle(LPTable tab, int ind, LPTable tabS) { LPTable tabR = tab->ReduceOne(ind); if(NULL == tabR) { printf("Error creating new table :: ReduceOneShuttle.\n"); return(NULL); } LPTable rez = new Table; if(NULL == rez) { printf("Error creating new table :: ReduceOneShuttle.\n"); tabR->Reset(); delete tabR; return(NULL); } if(!rez->Alloc(tab->Dimens, tab->nDimens)) { printf("Error creating new table :: ReduceOneShuttle.\n"); tabR->Reset(); delete tabR; delete rez; return(NULL); } rez->GetFirst(); int i, j; int NotFinished = 1; while(NotFinished) { j = 0; for(i=0; i<rez->nDimens; i++) { if(i != ind) { tabR->Index[j] = rez->Index[i]; j++; tabS->Index[i] = rez->Index[i]; } } double s = 0.0; for(i=0; i<rez->Dimens[ind]; i++) { if(i != rez->Index[ind]) { tabS->Index[ind] = i; s += tabS->Get(); } } rez->Set(tabR->Get() - s); if(NotFinished) { NotFinished = rez->GetNext(); } } tabR->Reset(); delete tabR; return rez; }