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; }
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; }