Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
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);
	}
}
Ejemplo n.º 7
0
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);
}
Ejemplo n.º 8
0
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;
}
Ejemplo n.º 9
0
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);
    }
}
Ejemplo n.º 10
0
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;	
}
Ejemplo n.º 11
0
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;
}
Ejemplo n.º 12
0
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;
}
Ejemplo n.º 13
0
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;
}
Ejemplo n.º 14
0
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;
}
Ejemplo n.º 15
0
s32 _LBList<BTECOLL>::fieldSize(u32 field) {
	_LBListField<BTECOLL>* cField = fetchField(field);	
	s32 res = cField->info()->entries;
	releaseField(cField);
	return res;
}