AMI_err _LBList<BTECOLL>::catFields(lpair_t *pairs, s32 numPairs, int mod2) { s32 newEntries[MAX_FIELD_ENTRIES], numNewEntries; AMI_err result = AMI_ERROR_NO_ERROR; for (s32 i=0; i<numPairs; ++i) { printTmp("LList::catFields: total %" PRId32 " pairs done out of %" PRId32 ".",i,numPairs); assert(pairs[i].x < (s32)_count && "index out of range!"); assert(pairs[i].y < (s32)_count && "index out of range!"); _LBListField<BTECOLL>* entry0 = fetchField(pairs[i].x); _LBListField<BTECOLL>* entry1 = fetchField(pairs[i].y); numNewEntries=0; for (u32 j=0; (j<entry0->info()->entries) && (numNewEntries < MAX_FIELD_ENTRIES); j++) { newEntries[numNewEntries++] = entry0->el[j]; } for (u32 j=0; (j<entry1->info()->entries) && (numNewEntries < MAX_FIELD_ENTRIES); j++) { newEntries[numNewEntries++] = entry1->el[j]; } if (numNewEntries >= MAX_FIELD_ENTRIES) { printf("MAX_FIELD_ENTRIES exceeded (i=%" PRId32 ", c0=%" PRId32 ", c1=%" PRId32 ".). Ignoring...\n",i,pairs[i].x,pairs[i].y); return AMI_ERROR_GENERIC_ERROR; } qsort(newEntries, numNewEntries, sizeof(s32), cmpS32s); int newEndLoc=0; int i=0; int j=0; while (i<numNewEntries) { /* How many copies of newEntries[i] are there? */ j=i+1; while ((j<numNewEntries) && (newEntries[j]==newEntries[i])) { j++; } if (mod2) { if ((j-i)%2 == 0) { /* An even number of them, so omit them altogether. */ i=j; } else { /* Copy one of them over. */ newEntries[newEndLoc++] = newEntries[i]; i=j; } } else { /* Copy one of them over. */ newEntries[newEndLoc++] = newEntries[i]; i=j; } } for (int i=0; i<newEndLoc; ++i) { (entry0->el)[i]=newEntries[i]; } (entry0->info())->entries=newEndLoc; releaseField(entry0); releaseField(entry1); } return result; }
int _LSList::numCommonEntries(s32 field0, s32 field1) { u32 i, j, num=0; _LSListField* entry0 = fetchField(field0); _LSListField* entry1 = fetchField(field1); for (i=0; i<entry0->numEntries(); i++) { for (j=0; j<entry1->numEntries(); j++) { if (entry0->at(i)==entry1->at(j)) { ++num; } } } releaseField(entry0); releaseField(entry1); return num; }
s32 _LBList<BTECOLL>::Weight() { s32 N=0; for (u32 i=0; i<_count; ++i) { _LBListField<BTECOLL>* cField = fetchField(i); N+=cField->info()->entries; releaseField(cField); } return N; }
int _LBList<BTECOLL>::numCommonEntries(s32 field0, s32 field1) { u32 i, j, num=0; assert (field0 < (s32)_count && "index out of range"); assert (field1 < (s32)_count && "index out of range"); _LBListField<BTECOLL>* entry0 = fetchField(field0); _LBListField<BTECOLL>* entry1 = fetchField(field1); for (i=0; i<entry0->info()->entries; i++) { for (j=0; j<entry1->info()->entries; j++) { if ((entry0->el)[i]==(entry1->el)[j]) { num++; } } } releaseField(entry0); releaseField(entry1); return num; }
AMI_err _LBList<BTECOLL>::appendToField(s32 entry, s32 *entries, s32 numEntries) { AMI_err result = AMI_ERROR_NO_ERROR; reallocateEntries(); _LBListField<BTECOLL>* newEntry = fetchField(entry); for (int i=0; i<numEntries; ++i) { (newEntry->el).insert(entries[i],(newEntry->info()->entries)++); } releaseField(newEntry); return result; }
void _LSList::toLList_t(llist_t* L) { ll_init(L,Weight(),numFields()); L->numFields=numFields(); for (u32 i=0; i<_m_count(); ++i) { _LSListField* cField = fetchField(i); for (u32 j=0; j<cField->numEntries();++j) { L->data[L->index[i]+j]=cField->at(j); } L->index[i+1]=L->index[i]+cField->numEntries(); releaseField(cField); } }
void _LBList<BTECOLL>::sortEntries(u32 field) { _LBListField<BTECOLL>* cField = fetchField(field); s32* entries = new s32[cField->info()->entries]; for (u32 i=0; i<cField->info()->entries; ++i) { entries[i] = cField->el[i]; } qsort(entries, cField->info()->entries, sizeof(s32), cmpS32s); for (u32 i=0; i<cField->info()->entries; ++i) { cField->el[i] = entries[i]; } delete[] entries; releaseField(cField); }
s32 _LBList<BTECOLL>::getMaxEntry() { s32 N=0; for (u32 i=0; i<_count; ++i) { _LBListField<BTECOLL>* cField = fetchField(i); for (u32 j=0; j<cField->info()->entries;++j) { if ((cField->el[j] > N) && (cField->el[j] != (s32)BAD_LP_INDEX)) { N=cField->el[j]; } } releaseField(cField); } return N; }
END_TEST START_TEST(test_tick) { Field *f; for (unsigned int i = 1; i < sizeof(fields) / sizeof(char *) - 1; i++) { f = fieldFromString(fields[i]); tick(f); char str[400]; fieldToString(f, str, sizeof(str)); char infostr[400]; if (mycompare(str, fields[i + 1], infostr) != 0) { releaseField(f); fail("[M4.02.d] After tick()\n%s should evolve into\n%s. Your field:\n%s\nReason: %s\n", fields[i], fields[i+1], str, infostr); } releaseField(f); } }
llist_t * _LBList<BTECOLL>::toLList_t() { llist_t* P = (llist_t *)lxmalloc(sizeof(llist_t),1); ll_init(P,Weight(),numFields()); for (u32 i=0; i<_count; ++i) { // do bulk load. Without any cache. _LBListField<BTECOLL>* cField = fetchField(i); for (u32 j=0; j<cField->info()->entries;++j) { P->data[P->index[i]+j]=cField->el[j]; } P->index[i+1]=P->index[i]+cField->info()->entries; releaseField(cField); } return P; }
AMI_err _LBList<BTECOLL>::appendField(s32 *entries, s32 numEntries) { AMI_err result = AMI_ERROR_NO_ERROR; reallocateEntries(); _LBListField<BTECOLL>* newEntry = new _LBListField<BTECOLL> (_collection,(AMI_bid)0); _entries[_count] = newEntry->bid(); for (int i=0; i<numEntries; ++i) { (newEntry->el)[i]=entries[i]; } newEntry->info()->entries=numEntries; newEntry->persist(PERSIST_PERSISTENT); ++_count; releaseField(newEntry); return result; }
AMI_err _LBList<BTECOLL>::appendField(const _LBListField<BTECOLL>& oldEntry) { AMI_err result = AMI_ERROR_NO_ERROR; reallocateEntries(); _LBListField<BTECOLL>* cField = new _LBListField<BTECOLL>(_collection,(AMI_bid)0); _entries[_count] = cField->bid(); for (u32 i=0; i<(oldEntry.info())->entries; ++i) { (cField->el)[i]=oldEntry.el[i]; } cField->info()->entries=(oldEntry.info())->entries; cField->persist(PERSIST_PERSISTENT); ++_count; releaseField(cField); return result; }
AMI_err _LBList<BTECOLL>::deleteFields(s32 *fields, s32 numFields) { AMI_err result = AMI_ERROR_NO_ERROR; for (int i=0; i<numFields; ++i) { if ((u32)fields[i] >= _count) { std::cout << "Error in LList::deleteFields: index out of range: " << fields[i] <<" out of " << _count << endl ; assert(false); } _LBListField<BTECOLL>* deleteEntry = fetchField(fields[i]); deleteEntry->persist(PERSIST_DELETE); releaseField(deleteEntry); } s32 cIdx=fields[0]; for (int i=0; i<numFields; ++i) { s32 moveEnd = (i<(numFields-1)) ? (fields[i+1]):(_count); for (int j=fields[i]+1; j<moveEnd; ++j, ++cIdx) { _entries[cIdx]=_entries[j]; } } _count-=numFields; return result; }
AMI_err _LSList::catFields(lpair_t *pairs, s32 numPairs, bool mod2) { s32 newEntries[MAX_FIELD_ENTRIES], numNewEntries; AMI_err result = AMI_ERROR_NO_ERROR; char *base_name = tpie_tempnam("LSList"); u32 buffSize = 0; s32* buff = NULL; std::vector<off_t>* newOffsets = new std::vector<off_t>; newOffsets->push_back(0); AMI_stream<s32>* newBaseStream = new AMI_stream<s32>(base_name); newBaseStream->persist(_m_per); _LSListField** pairs_y = new _LSListField*[numPairs]; s32* pairs_x = new s32[numPairs]; for (s32 i=0; i<numPairs; ++i) { pairs_y[i] = fetchField(pairs[i].y); pairs_x[i] = pairs[i].x; } _m_baseStream->seek(0); s32 cdfield = 0; for (u32 i=0; i<_m_count(); ++i) { TPIE_OS_OFFSET fs = fieldSize(i); if (fs>buffSize) { buffSize = fs; delete[] buff; buff = new s32[buffSize]; } _m_baseStream->read_array(buff,&fs); if (cdfield<numPairs && (s32)i==pairs[cdfield].x && checkPair(pairs_x,cdfield,pairs[cdfield].y)) { numNewEntries=0; for (u32 j=0; (j<fs) && (numNewEntries < MAX_FIELD_ENTRIES); j++) { newEntries[numNewEntries++] = buff[j]; } for (u32 j=0; (j<pairs_y[cdfield]->numEntries()) && (numNewEntries < MAX_FIELD_ENTRIES); j++) { newEntries[numNewEntries++] = pairs_y[cdfield]->at(j); } if (numNewEntries >= MAX_FIELD_ENTRIES) { printf("MAX_FIELD_ENTRIES exceeded (i=%" PRId32 ", c0=%" PRId32 ", c1=%" PRId32 ".). Ignoring...\n",i,pairs[i].x,pairs[i].y); return AMI_ERROR_GENERIC_ERROR; } qsort(newEntries, numNewEntries, sizeof(s32), cmpS32s); int newEndLoc=0; int i=0; int j=0; while (i<numNewEntries) { /* How many copies of newEntries[i] are there? */ j=i+1; while ((j<numNewEntries) && (newEntries[j]==newEntries[i])) { j++; } if (mod2) { if ((j-i)%2 == 0) { /* An even number of them, so omit them altogether. */ i=j; } else { /* Copy one of them over. */ newEntries[newEndLoc++] = newEntries[i]; i=j; } } else { /* Copy one of them over. */ newEntries[newEndLoc++] = newEntries[i]; i=j; } } newBaseStream->write_array(newEntries,newEndLoc); releaseField(pairs_y[cdfield++]); } else { newBaseStream->write_array(buff,fs); } newOffsets->push_back(newBaseStream->tell()); } delete[] pairs_y; delete[] buff; delete[] pairs_x; delete _m_fields; delete _m_baseStream; _m_fields=newOffsets; _m_baseStream = newBaseStream; return result; }
s32 _LBList<BTECOLL>::fieldSize(u32 field) { _LBListField<BTECOLL>* cField = fetchField(field); s32 res = cField->info()->entries; releaseField(cField); return res; }