Пример #1
0
int cgm_solver(uint32_t a, uint32_t b, uint32_t c, uint32_t** matches, struct db* database)
{
	int sections, secLength, aLength, bLength, cLength;
	int double1, double2, double3;
	int triple;
	int count;

	uint32_t* dubMatches1 = NULL;
	uint32_t* dubMatches2 = NULL;
	uint32_t* dubMatches3 = NULL;

	uint32_t* tripMatches = NULL;

	uint32_t* temp;

	int keySize = 16;

	uint32_t* aList = NULL;
	uint32_t* bList = NULL;
	uint32_t* cList = NULL;

	aLength = db_query(database, a, &aList);
	bLength = db_query(database, b, &bList);
	cLength = db_query(database, c, &cList);

	double1 = doubleMatch(aList, bList, aLength, bLength, keySize, &dubMatches1, 0, 0);
	double2 = doubleMatch(aList, cList, aLength, cLength, keySize, &dubMatches2, keySize, 0);
	double3 = doubleMatch(bList, cList, bLength, cLength, keySize, &dubMatches3, 0, keySize);

	triple = doubleMatch(dubMatches1, dubMatches2, double1, double2, 0, &tripMatches, 0, 0);

	if(triple > 0){
		*matches = tripMatches;
		count = triple;
	}
	else if(double1 + double2 + double3 > 0)
	{
		count = mergeLists(dubMatches1, dubMatches2, dubMatches3, double1, double2, double3, &temp);

		*matches = temp;
	}
	else
	{
		count = mergeLists(aList, bList, cList, aLength, bLength, cLength, &temp);

		*matches = temp;
	}

	/* free any allocated memory and return the number items in matches */
		free(aList);
		free(bList);
		free(cList);
		free(dubMatches1);
		free(dubMatches2);
		free(dubMatches3);
	if(triple == 0)
		free(tripMatches);

	return count;
}
Пример #2
0
int cgm(uint32_t a, uint32_t b, uint32_t c, uint32_t d, uint32_t** matches, struct db* database)
{
	int sections, secLength, aLength, bLength, cLength, dLength;
	int double1, double2, double3, double4, double5, double6;
	int quad, triple1, triple2, triple3, triple4;
	int itempA, itempB;
	int count;
	
	struct timeval t1, t2;
    double elapsedTime;
	
	uint32_t* dubMatches1 = NULL;
	uint32_t* dubMatches2 = NULL;
	uint32_t* dubMatches3 = NULL;
	uint32_t* dubMatches4 = NULL;
	uint32_t* dubMatches5 = NULL;
	uint32_t* dubMatches6 = NULL;
	
	uint32_t* tripMatches1 = NULL;
	uint32_t* tripMatches2 = NULL;
	uint32_t* tripMatches3 = NULL;
	uint32_t* tripMatches4 = NULL;

	uint32_t* quadMatches = NULL;

	uint32_t* tempA;
	uint32_t* tempB;
	uint32_t* tempC;

	int keySize = 16;

	uint32_t* aList = NULL;
	uint32_t* bList = NULL;
	uint32_t* cList = NULL;
	uint32_t* dList = NULL;

	aLength = db_query(database, a, &aList);
	bLength = db_query(database, b, &bList);
	cLength = db_query(database, c, &cList);
	dLength = db_query(database, d, &dList);
	
	gettimeofday(&t1, NULL);

	double1 = doubleMatch(aList, bList, aLength, bLength, keySize, &dubMatches1, 0, 0);
	double2 = doubleMatch(aList, cList, aLength, cLength, keySize, &dubMatches2, keySize, 0);
	double3 = doubleMatch(aList, dList, aLength, dLength, keySize, &dubMatches3, keySize*2, 0);
	double4 = doubleMatch(bList, cList, bLength, cLength, keySize, &dubMatches4, 0, keySize);
	double5 = doubleMatch(bList, dList, bLength, dLength, keySize, &dubMatches5, keySize, keySize);
	double6 = doubleMatch(cList, dList, cLength, dLength, keySize, &dubMatches6, 0, keySize*2);

	quad = doubleMatch(dubMatches1, dubMatches6, double1, double6, 0, &quadMatches, 0, 0);
	triple1 = doubleMatch(dubMatches1, dubMatches2, double1, double2, 0, &tripMatches1, 0, 0);
	triple2 = doubleMatch(dubMatches1, dubMatches3, double1, double3, 0, &tripMatches2, 0, 0);
	triple3 = doubleMatch(dubMatches2, dubMatches3, double2, double3, 0, &tripMatches3, 0, 0);
	triple4 = doubleMatch(dubMatches4, dubMatches5, double4, double5, 0, &tripMatches4, 0, 0);

	if(quad > 0){
		*matches = quadMatches;
		count = quad;
	}
	else if(triple1 + triple2 + triple3 + triple4 > 0)
	{
		itempA = mergeLists(tripMatches1, tripMatches2, NULL, triple1, triple2, 0, &tempA);
		itempB = mergeLists(tripMatches3, tripMatches4, NULL, triple3, triple4, 0, &tempB);
		
		count = mergeLists(tempA, tempB, NULL, itempA, itempB, 0, &tempC);
		*matches = tempC;
		
		free(tempA);
		free(tempB);

	}
	else if(double1 + double2 + double3 + double4 + double5 + double6 > 0)
	{
		itempA = mergeLists(dubMatches1, dubMatches2, dubMatches3, double1, double2, double3, &tempA);
		itempB = mergeLists(dubMatches4, dubMatches5, dubMatches6, double4, double5, double6, &tempB);

		count = mergeLists(tempA, tempB, NULL, itempA, itempB, 0, &tempC);
		*matches = tempC;

		free(tempA);
		free(tempB);

	}
	else
	{
		itempA = mergeLists(aList, bList, NULL, aLength, bLength, 0, &tempA);
		itempB = mergeLists(cList, dList, NULL, cLength, dLength, 0, &tempB);
		
		count = mergeLists(tempA, tempB, NULL, itempA, itempB, 0, &tempC);
		*matches = tempC;

		free(tempA);
		free(tempB);
	}

	/* free any allocated memory and return the number items in matches */
		free(aList);
		free(bList);
		free(cList);
		free(dList);
		free(tripMatches1);
		free(tripMatches2);
		free(tripMatches3);
		free(tripMatches4);
		free(dubMatches1);
		free(dubMatches2);
		free(dubMatches3);
		free(dubMatches4);
		free(dubMatches5);
		free(dubMatches6);
	if(quad == 0)
		free(quadMatches);

	gettimeofday(&t2, NULL);
	elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0;      // sec to ms
	elapsedTime += (t2.tv_usec - t1.tv_usec) / 1000.0;   // us to ms
	seq += elapsedTime;
//	printf("Time: %f\n", elapsedTime);

	return count;
}