int stSortedSet_equals(stSortedSet *sortedSet1, stSortedSet *sortedSet2) { if(stSortedSet_size(sortedSet1) != stSortedSet_size(sortedSet2)) { return 0; } if(!stSortedSet_comparatorsEqual(sortedSet1, sortedSet2)) { return 0; } int (*cmpFn)(const void *, const void *) = stSortedSet_getComparator(sortedSet1)->compareFn; stSortedSetIterator *it1 = stSortedSet_getIterator(sortedSet1); stSortedSetIterator *it2 = stSortedSet_getIterator(sortedSet2); void *o1 = stSortedSet_getNext(it1), *o2 = stSortedSet_getNext(it2); while(o1 != NULL && o2 != NULL) { if(cmpFn(o1, o2) != 0) { stSortedSet_destructIterator(it1); stSortedSet_destructIterator(it2); return 0; } o1 = stSortedSet_getNext(it1); o2 = stSortedSet_getNext(it2); } stSortedSet_destructIterator(it1); stSortedSet_destructIterator(it2); return 1; }
static void checkComponents(CuTest *testCase, stList *filteredEdges) { stHash *nodesToComponents = getComponents(filteredEdges); //Check all components are smaller than threshold stList *components = stHash_getValues(nodesToComponents); for (int64_t i = 0; i < stList_length(components); i++) { stSortedSet *component = stList_get(components, i); CuAssertTrue(testCase, stSortedSet_size(component) <= maxComponentSize); CuAssertTrue(testCase, stSortedSet_size(component) >= 1); } //Check no edges can be added from those filtered. stSortedSet *filteredEdgesSet = stList_getSortedSet(filteredEdges, (int(*)(const void *, const void *)) stIntTuple_cmpFn); for (int64_t i = 0; i < stList_length(edges); i++) { stIntTuple *edge = stList_get(edges, i); if (stSortedSet_search(filteredEdgesSet, edge) == NULL) { stIntTuple *node1 = stIntTuple_construct1( stIntTuple_get(edge, 1)); stIntTuple *node2 = stIntTuple_construct1( stIntTuple_get(edge, 2)); stSortedSet *component1 = stHash_search(nodesToComponents, node1); stSortedSet *component2 = stHash_search(nodesToComponents, node2); CuAssertTrue(testCase, component1 != NULL && component2 != NULL); CuAssertTrue(testCase, component1 != component2); CuAssertTrue(testCase, stSortedSet_size(component1) + stSortedSet_size(component2) > maxComponentSize); stIntTuple_destruct(node1); stIntTuple_destruct(node2); } } stSortedSet_destruct(filteredEdgesSet); //Cleanup the components stSortedSet *componentsSet = stList_getSortedSet(components, NULL); stList_destruct(components); stSortedSet_setDestructor(componentsSet, (void(*)(void *)) stSortedSet_destruct); stSortedSet_destruct(componentsSet); stHash_destruct(nodesToComponents); }
stList *stSortedSet_getList(stSortedSet *sortedSet) { stList *list = stList_construct2(stSortedSet_size(sortedSet)); stSortedSetIterator *it = stSortedSet_getIterator(sortedSet); void *o; int32_t i=0; while((o = stSortedSet_getNext(it)) != NULL) { stList_set(list, i++, o); } assert(i == stSortedSet_size(sortedSet)); stSortedSet_destructIterator(it); return list; }
static void test_stSortedSet_copyConstruct(CuTest* testCase) { sonLibSortedSetTestSetup(); CuAssertTrue(testCase, sortedSet != NULL); int32_t i; for(i=0; i<size; i++) { stSortedSet_insert(sortedSet, stIntTuple_construct(1, input[i])); } stSortedSet *sortedSet2 = stSortedSet_copyConstruct(sortedSet, NULL); CuAssertTrue(testCase, stSortedSet_size(sortedSet2) == stSortedSet_size(sortedSet)); CuAssertTrue(testCase, stSortedSet_equals(sortedSet2, sortedSet)); stSortedSet_destruct(sortedSet2); sonLibSortedSetTestTeardown(); }
static void makeMatchingPerfect(stList *chosenEdges, stList *adjacencyEdges, stSortedSet *nodes) { /* * While the the number of edges is less than a perfect matching add random edges. */ stSortedSet *attachedNodes = getNodeSetOfEdges(chosenEdges); stHash *nodesToAdjacencyEdges = getNodesToEdgesHash(adjacencyEdges); stIntTuple *pNode = NULL; stSortedSetIterator *it = stSortedSet_getIterator(nodes); stIntTuple *node; while((node = stSortedSet_getNext(it)) != NULL) { if (stSortedSet_search(attachedNodes, node) == NULL) { if (pNode == NULL) { pNode = node; } else { stList_append(chosenEdges, getEdgeForNodes(stIntTuple_get(pNode, 0), stIntTuple_get(node, 0), nodesToAdjacencyEdges)); pNode = NULL; } } } stSortedSet_destructIterator(it); assert(pNode == NULL); stSortedSet_destruct(attachedNodes); assert(stList_length(chosenEdges) * 2 == stSortedSet_size(nodes)); stHash_destruct(nodesToAdjacencyEdges); }
stList *getMatchingWithCyclicConstraints(stSortedSet *nodes, stList *adjacencyEdges, stList *stubEdges, stList *chainEdges, bool makeStubCyclesDisjoint, stList *(*matchingAlgorithm)(stList *edges, int64_t nodeNumber)) { /* * Check the inputs. */ checkInputs(nodes, adjacencyEdges, stubEdges, chainEdges); st_logDebug("Checked the inputs\n"); if (stSortedSet_size(nodes) == 0) { //Some of the following functions assume there are at least 2 nodes. return stList_construct(); } stList *chosenEdges = getPerfectMatching(nodes, adjacencyEdges, matchingAlgorithm); stSortedSet *allAdjacencyEdges = stList_getSortedSet(adjacencyEdges, (int(*)(const void *, const void *)) stIntTuple_cmpFn); stList *nonZeroWeightAdjacencyEdges = getEdgesWithGreaterThanZeroWeight( adjacencyEdges); stList *updatedChosenEdges = makeMatchingObeyCyclicConstraints(nodes, chosenEdges, allAdjacencyEdges, nonZeroWeightAdjacencyEdges, stubEdges, chainEdges, makeStubCyclesDisjoint); stList_destruct(chosenEdges); chosenEdges = updatedChosenEdges; stList_destruct(nonZeroWeightAdjacencyEdges); stSortedSet_destruct(allAdjacencyEdges); return chosenEdges; }
static void test_stSortedSetIntersection(CuTest* testCase) { sonLibSortedSetTestSetup(); //Check intersection of empty sets is okay.. stSortedSet *sortedSet3 = stSortedSet_getIntersection(sortedSet, sortedSet2); CuAssertTrue(testCase, stSortedSet_size(sortedSet3) == 0); stSortedSet_destruct(sortedSet3); int32_t i; for(i=0; i<size; i++) { stSortedSet_insert(sortedSet, stIntTuple_construct(1, input[i])); } //Check intersection of empty and non-empty set is empty. sortedSet3 = stSortedSet_getIntersection(sortedSet, sortedSet2); CuAssertTrue(testCase, stSortedSet_size(sortedSet3) == 0); stSortedSet_destruct(sortedSet3); //Check intersection of two non-empty, overlapping sets in correct. stSortedSet_insert(sortedSet2, stIntTuple_construct(1, 0)); stSortedSet_insert(sortedSet2, stIntTuple_construct(1, 1)); stSortedSet_insert(sortedSet2, stIntTuple_construct(1, 5)); sortedSet3 = stSortedSet_getIntersection(sortedSet, sortedSet2); CuAssertTrue(testCase, stSortedSet_size(sortedSet3) == 2); stIntTuple *intTuple = stIntTuple_construct(1, 1); CuAssertTrue(testCase, stSortedSet_search(sortedSet3, intTuple) != NULL); stIntTuple_destruct(intTuple); intTuple = stIntTuple_construct(1, 5); CuAssertTrue(testCase, stSortedSet_search(sortedSet3, intTuple) != NULL); stIntTuple_destruct(intTuple); stSortedSet_destruct(sortedSet3); //Check we get an exception with sorted sets with different comparators. stSortedSet *sortedSet4 = stSortedSet_construct(); stTry { stSortedSet_getIntersection(sortedSet, sortedSet4); } stCatch(except) { CuAssertTrue(testCase, stExcept_getId(except) == SORTED_SET_EXCEPTION_ID); } stTryEnd stSortedSet_destruct(sortedSet4); sonLibSortedSetTestTeardown(); }
static void test_stSortedSetDifference(CuTest* testCase) { sonLibSortedSetTestSetup(); //Check difference of empty sets is okay.. stSortedSet *sortedSet3 = stSortedSet_getDifference(sortedSet, sortedSet2); CuAssertTrue(testCase, stSortedSet_size(sortedSet3) == 0); stSortedSet_destruct(sortedSet3); int32_t i; for(i=0; i<size; i++) { stSortedSet_insert(sortedSet, stIntTuple_construct(1, input[i])); } //Check difference of non-empty set / empty set is the non-empty. sortedSet3 = stSortedSet_getDifference(sortedSet, sortedSet2); CuAssertTrue(testCase, stSortedSet_equals(sortedSet, sortedSet3)); stSortedSet_destruct(sortedSet3); //Check difference of two non-empty, overlapping sets in correct. stSortedSet_insert(sortedSet2, stIntTuple_construct(1, 0)); stSortedSet_insert(sortedSet2, stIntTuple_construct(1, 1)); stSortedSet_insert(sortedSet2, stIntTuple_construct(1, 5)); sortedSet3 = stSortedSet_getDifference(sortedSet, sortedSet2); CuAssertTrue(testCase, stSortedSet_size(sortedSet3) == stSortedSet_size(sortedSet) - 2); CuAssertTrue(testCase, !stSortedSet_equals(sortedSet, sortedSet3)); stSortedSet_insert(sortedSet3, stIntTuple_construct(1, 1)); stSortedSet_insert(sortedSet3, stIntTuple_construct(1, 5)); CuAssertTrue(testCase, stSortedSet_equals(sortedSet, sortedSet3)); stSortedSet_destruct(sortedSet3); //Check we get an exception when merging sorted sets with different comparators. stSortedSet *sortedSet4 = stSortedSet_construct(); stTry { stSortedSet_getDifference(sortedSet, sortedSet4); CuAssertTrue(testCase, 0); } stCatch(except) { CuAssertTrue(testCase, stExcept_getId(except) == SORTED_SET_EXCEPTION_ID); } stTryEnd stSortedSet_destruct(sortedSet4); sonLibSortedSetTestTeardown(); }
static void testBreakUpComponentGreedily(CuTest *testCase) { //return; for (int64_t test = 0; test < 100; test++) { st_logInfo("Starting break up giant components random test %" PRIi64 "\n", test); setup(); stList *edgesToDelete = stCaf_breakupComponentGreedily(nodes, edges, maxComponentSize); stSortedSet *edgesSet = stList_getSortedSet(edges, (int(*)(const void *, const void *)) stIntTuple_cmpFn); stSortedSet *edgesToDeleteSet = stList_getSortedSet(edgesToDelete, (int(*)(const void *, const void *)) stIntTuple_cmpFn); stSortedSet *filteredEdgesSet = stSortedSet_getDifference(edgesSet, edgesToDeleteSet); stList *filteredEdges = stSortedSet_getList(filteredEdgesSet); assert(stSortedSet_size(edgesToDeleteSet) + stSortedSet_size(filteredEdgesSet) == stSortedSet_size(edgesSet)); checkComponents(testCase, filteredEdges); stSortedSet_destruct(edgesSet); stSortedSet_destruct(edgesToDeleteSet); stSortedSet_destruct(filteredEdgesSet); stList_destruct(filteredEdges); stList_destruct(edgesToDelete); teardown(); } }
static void test_stSortedSet(CuTest* testCase) { sonLibSortedSetTestSetup(); int32_t i; CuAssertIntEquals(testCase, 0, stSortedSet_size(sortedSet)); for(i=0; i<size; i++) { stSortedSet_insert(sortedSet, stIntTuple_construct(1, input[i])); } CuAssertIntEquals(testCase, sortedSize, stSortedSet_size(sortedSet)); CuAssertIntEquals(testCase, sortedInput[0], stIntTuple_getPosition(stSortedSet_getFirst(sortedSet), 0)); CuAssertIntEquals(testCase, sortedInput[sortedSize-1], stIntTuple_getPosition(stSortedSet_getLast(sortedSet), 0)); for(i=0; i<sortedSize; i++) { CuAssertIntEquals(testCase, sortedSize-i, stSortedSet_size(sortedSet)); stIntTuple *tuple = stIntTuple_construct(1, sortedInput[i]); CuAssertTrue(testCase, stIntTuple_getPosition(stSortedSet_search(sortedSet, tuple), 0) == sortedInput[i]); stSortedSet_remove(sortedSet, tuple); CuAssertTrue(testCase, stSortedSet_search(sortedSet, tuple) == NULL); stIntTuple_destruct(tuple); } sonLibSortedSetTestTeardown(); }
/* Check that all tuple records in a set are present and have the expect * value. The expected value in the set is multiplied by valueMult to get * the actual expected value */ static void readWriteAndRemoveRecordsLotsCheck(CuTest *testCase, stSortedSet *set, int valueMult) { CuAssertIntEquals(testCase, stSortedSet_size(set), stKVDatabase_getNumberOfRecords(database)); stSortedSetIterator *it = stSortedSet_getIterator(set); stIntTuple *tuple; while ((tuple = stSortedSet_getNext(it)) != NULL) { int32_t *value = (int32_t *) stKVDatabase_getRecord(database, stIntTuple_getPosition(tuple, 0)); CuAssertTrue(testCase, stKVDatabase_containsRecord(database, stIntTuple_getPosition(tuple, 0))); CuAssertIntEquals(testCase, valueMult*stIntTuple_getPosition(tuple, 0), *value); free(value); } stSortedSet_destructIterator(it); }
static enum CapCode getHaplotypeSwitchCode(Cap *cap, stList *eventStrings) { Cap *adjacentCap = cap_getAdjacency(getTerminalCap(cap)); assert(adjacentCap != NULL); End *end = cap_getEnd(cap); End *adjacentEnd = cap_getEnd(adjacentCap); stSortedSet *eventStringsForEnd1 = getEventStrings(end, eventStrings); stSortedSet *eventStringsForEnd2 = getEventStrings(adjacentEnd, eventStrings); assert(stSortedSet_size(eventStringsForEnd1) > 0); assert(stSortedSet_size(eventStringsForEnd2) > 0); stSortedSet *intersectionOfEventStrings = stSortedSet_getIntersection( eventStringsForEnd1, eventStringsForEnd2); enum CapCode code1 = (stSortedSet_size(intersectionOfEventStrings) != stSortedSet_size(eventStringsForEnd1) || stSortedSet_size( intersectionOfEventStrings) != stSortedSet_size(eventStringsForEnd2)) ? HAP_SWITCH : HAP_NOTHING; stSortedSet_destruct(eventStringsForEnd1); stSortedSet_destruct(eventStringsForEnd2); stSortedSet_destruct(intersectionOfEventStrings); return code1; }
void test_stList_getSortedSet(CuTest *testCase) { setup(); stSortedSet *sortedSet = stList_getSortedSet(list, (int (*)(const void *, const void *))strcmp); CuAssertTrue(testCase, stSortedSet_size(sortedSet) == stringNumber); stSortedSetIterator *iterator = stSortedSet_getIterator(sortedSet); CuAssertStrEquals(testCase, "five", stSortedSet_getNext(iterator)); CuAssertStrEquals(testCase, "four", stSortedSet_getNext(iterator)); CuAssertStrEquals(testCase, "one", stSortedSet_getNext(iterator)); CuAssertStrEquals(testCase, "three", stSortedSet_getNext(iterator)); CuAssertStrEquals(testCase, "two", stSortedSet_getNext(iterator)); stSortedSet_destructIterator(iterator); stSortedSet_destruct(sortedSet); teardown(); }
static void getMAFBlock2(Block *block, FILE *fileHandle) { if (block_getLength(block) >= minimumBlockLength) { //Calculate bases in the reference and other reference sequence Block_InstanceIterator *instanceIt = block_getInstanceIterator(block); bool includesReference = 0; bool includesOtherReference = 0; Segment *segment; while ((segment = block_getNext(instanceIt)) != NULL) { const char *segmentEvent = event_getHeader( segment_getEvent(segment)); if (strcmp(segmentEvent, referenceEventString) == 0) { includesReference = 1; } else if (strcmp(segmentEvent, otherReferenceEventString) == 0) { includesOtherReference = 1; } } block_destructInstanceIterator(instanceIt); if (ignoreOtherReferenceBlocks && includesOtherReference) { return; } stSortedSet *otherSampleEvents = stSortedSet_construct3( (int(*)(const void *, const void *)) strcmp, NULL); instanceIt = block_getInstanceIterator(block); int32_t sampleNumber = 0; while ((segment = block_getNext(instanceIt)) != NULL) { const char *segmentEvent = event_getHeader( segment_getEvent(segment)); if (strcmp(segmentEvent, sampleEventString) == 0) { sampleNumber++; } else if (strcmp(segmentEvent, referenceEventString) != 0) { stSortedSet_insert(otherSampleEvents, (void *) segmentEvent); } } block_destructInstanceIterator(instanceIt); baseCoverages[stSortedSet_size(otherSampleEvents)] += block_getLength( block) * sampleNumber; stSortedSet_destruct(otherSampleEvents); referenceBases += includesReference ? block_getLength(block) * sampleNumber : 0; otherReferenceBases += includesOtherReference ? block_getLength(block) * sampleNumber : 0; } }
static stSortedSet *getOddNodes(stList *cycle) { /* * Returns alternating nodes in a simple cycle. */ //Set to return stSortedSet *nodes = stSortedSet_construct3( (int(*)(const void *, const void *)) stIntTuple_cmpFn, (void(*)(void *)) stIntTuple_destruct); stHash *nodesToEdges = getNodesToEdgesHash(cycle); int64_t node = stIntTuple_get(stList_get(cycle, 0), 0); int64_t pNode = -1; int64_t counter = 0; bool b = 1; assert(stList_length(cycle) % 2 == 0); while (counter++ < stList_length(cycle)) { if (b) { //Make alternating addNodeToSet(nodes, node); b = 0; } else { b = 1; } stList *edges = getItemForNode(node, nodesToEdges); assert(stList_length(edges) == 2); stIntTuple *edge = stList_get(edges, 0); int64_t node2 = getOtherPosition(edge, node); if (node2 != pNode) { pNode = node; node = node2; continue; } edge = stList_get(edges, 1); node2 = getOtherPosition(edge, node); assert(node2 != pNode); pNode = node; node = node2; } stHash_destruct(nodesToEdges); assert(stList_length(cycle) / 2 == stSortedSet_size(nodes)); return nodes; }
void checkInputs(stSortedSet *nodes, stList *adjacencyEdges, stList *stubEdges, stList *chainEdges) { /* * Checks the inputs to the algorithm are as expected. */ int64_t nodeNumber = stSortedSet_size(nodes); assert(nodeNumber % 2 == 0); if (nodeNumber > 0) { assert(stList_length(stubEdges) > 0); } assert( stList_length(stubEdges) + stList_length(chainEdges) == (nodeNumber / 2)); checkEdges(stubEdges, nodes, 0, 0); checkEdges(chainEdges, nodes, 0, 0); stList *stubsAndChainEdges = stList_copy(stubEdges, NULL); stList_appendAll(stubsAndChainEdges, chainEdges); checkEdges(stubsAndChainEdges, nodes, 1, 0); stList_destruct(stubsAndChainEdges); checkEdges(adjacencyEdges, nodes, 1, 1); }
stList *makeMatchingObeyCyclicConstraints(stSortedSet *nodes, stList *chosenEdges, stSortedSet *allAdjacencyEdges, stList *nonZeroWeightAdjacencyEdges, stList *stubEdges, stList *chainEdges, bool makeStubCyclesDisjoint) { if (stSortedSet_size(nodes) == 0) { //Some of the following functions assume there are at least 2 nodes. return stList_construct(); } /* * Merge in the stub free components. */ chosenEdges = mergeSimpleCycles2(chosenEdges, nonZeroWeightAdjacencyEdges, allAdjacencyEdges, stubEdges, chainEdges); st_logDebug( "After merging in chain only cycles the matching has %" PRIi64 " edges, %" PRIi64 " cardinality and %" PRIi64 " weight\n", stList_length(chosenEdges), matchingCardinality(chosenEdges), matchingWeight(chosenEdges)); /* * Split stub components. */ if (makeStubCyclesDisjoint) { stList *updatedChosenEdges = splitMultipleStubCycles(chosenEdges, nonZeroWeightAdjacencyEdges, allAdjacencyEdges, stubEdges, chainEdges); stList_destruct(chosenEdges); chosenEdges = updatedChosenEdges; st_logDebug( "After making stub cycles disjoint the matching has %" PRIi64 " edges, %" PRIi64 " cardinality and %" PRIi64 " weight\n", stList_length(chosenEdges), matchingCardinality(chosenEdges), matchingWeight(chosenEdges)); } else { st_logDebug("Not making stub cycles disjoint\n"); } return chosenEdges; }
stList *getPerfectMatching(stSortedSet *nodes, stList *adjacencyEdges, stList *(*matchingAlgorithm)(stList *edges, int64_t nodeNumber)) { checkEdges(adjacencyEdges, nodes, 1, 1); //Checks edges are clique if (stSortedSet_size(nodes) == 0) { //Some of the following functions assume there are at least 2 nodes. return stList_construct(); } stList *nonZeroWeightAdjacencyEdges = getEdgesWithGreaterThanZeroWeight( adjacencyEdges); stList *chosenEdges = getSparseMatching(nodes, nonZeroWeightAdjacencyEdges, matchingAlgorithm); stList_destruct(nonZeroWeightAdjacencyEdges); makeMatchingPerfect(chosenEdges, adjacencyEdges, nodes); st_logDebug( "Chosen a perfect matching with %" PRIi64 " edges, %" PRIi64 " cardinality and %" PRIi64 " weight\n", stList_length(chosenEdges), matchingCardinality(chosenEdges), matchingWeight(chosenEdges)); return chosenEdges; }
int64_t flower_getSequenceNumber(Flower *flower) { return stSortedSet_size(flower->sequences); }
int64_t flower_getFaceNumber(Flower *flower) { return stSortedSet_size(flower->faces); }
int64_t flower_getChainNumber(Flower *flower) { return stSortedSet_size(flower->chains); }
int64_t flower_getGroupNumber(Flower *flower) { return stSortedSet_size(flower->groups); }
int64_t flower_getBlockNumber(Flower *flower) { return stSortedSet_size(flower->blocks); }
int64_t flower_getSegmentNumber(Flower *flower) { return stSortedSet_size(flower->segments); }
static void readWriteAndRemoveRecordsLotsIteration(CuTest *testCase, int numRecords, bool reopenDatabase) { //Make a big old list of records.. stSortedSet *set = stSortedSet_construct3((int(*)(const void *, const void *)) stIntTuple_cmpFn, (void(*)(void *)) stIntTuple_destruct); while (stSortedSet_size(set) < numRecords) { int32_t key = st_randomInt(0, 100 * numRecords); stIntTuple *tuple = stIntTuple_construct(1, key); if (stSortedSet_search(set, tuple) == NULL) { CuAssertTrue(testCase, !stKVDatabase_containsRecord(database, key)); stSortedSet_insert(set, tuple); stKVDatabase_insertRecord(database, key, &key, sizeof(int32_t)); CuAssertTrue(testCase, stKVDatabase_containsRecord(database, key)); } else { CuAssertTrue(testCase, stKVDatabase_containsRecord(database, key)); stIntTuple_destruct(tuple); // already in db } } readWriteAndRemoveRecordsLotsCheck(testCase, set, 1); //Update all records to negate values stSortedSetIterator *it = stSortedSet_getIterator(set); stIntTuple *tuple; while ((tuple = stSortedSet_getNext(it)) != NULL) { int32_t *value = (int32_t *) stKVDatabase_getRecord(database, stIntTuple_getPosition(tuple, 0)); *value *= -1; stKVDatabase_updateRecord(database, stIntTuple_getPosition(tuple, 0), value, sizeof(int32_t)); CuAssertTrue(testCase, stKVDatabase_containsRecord(database, stIntTuple_getPosition(tuple, 0))); free(value); } stSortedSet_destructIterator(it); readWriteAndRemoveRecordsLotsCheck(testCase, set, -1); //Try optionally committing the transaction and reloading the database.. if (reopenDatabase) { //stKVDatabase_commitTransaction(database); stKVDatabase_destruct(database); database = stKVDatabase_construct(conf, false); //stKVDatabase_startTransaction(database); } //Now remove each one.. it = stSortedSet_getIterator(set); while ((tuple = stSortedSet_getNext(it)) != NULL) { CuAssertTrue(testCase, stKVDatabase_containsRecord(database, stIntTuple_getPosition(tuple, 0))); stKVDatabase_removeRecord(database, stIntTuple_getPosition(tuple, 0)); CuAssertTrue(testCase, !stKVDatabase_containsRecord(database, stIntTuple_getPosition(tuple, 0))); //Test we get exception if we remove twice. stTry { stKVDatabase_removeRecord(database, stIntTuple_getPosition(tuple, 0)); CuAssertTrue(testCase, 0); } stCatch(except) { CuAssertTrue(testCase, stExcept_getId(except) == ST_KV_DATABASE_EXCEPTION_ID); }stTryEnd; } stSortedSet_destructIterator(it); CuAssertIntEquals(testCase, 0, stKVDatabase_getNumberOfRecords(database)); stSortedSet_destruct(set); }
int main(int argc, char *argv[]) { st_setLogLevelFromString(argv[1]); st_logDebug("Set up logging\n"); stKVDatabaseConf *kvDatabaseConf = stKVDatabaseConf_constructFromString(argv[2]); CactusDisk *cactusDisk = cactusDisk_construct(kvDatabaseConf, 0); stKVDatabaseConf_destruct(kvDatabaseConf); st_logDebug("Set up the flower disk\n"); Name flowerName = cactusMisc_stringToName(argv[3]); Flower *flower = cactusDisk_getFlower(cactusDisk, flowerName); int64_t totalBases = flower_getTotalBaseLength(flower); int64_t totalEnds = flower_getEndNumber(flower); int64_t totalFreeEnds = flower_getFreeStubEndNumber(flower); int64_t totalAttachedEnds = flower_getAttachedStubEndNumber(flower); int64_t totalCaps = flower_getCapNumber(flower); int64_t totalBlocks = flower_getBlockNumber(flower); int64_t totalGroups = flower_getGroupNumber(flower); int64_t totalChains = flower_getChainNumber(flower); int64_t totalLinkGroups = 0; int64_t maxEndDegree = 0; int64_t maxAdjacencyLength = 0; int64_t totalEdges = 0; Flower_EndIterator *endIt = flower_getEndIterator(flower); End *end; while((end = flower_getNextEnd(endIt)) != NULL) { assert(end_getOrientation(end)); if(end_getInstanceNumber(end) > maxEndDegree) { maxEndDegree = end_getInstanceNumber(end); } stSortedSet *ends = stSortedSet_construct(); End_InstanceIterator *capIt = end_getInstanceIterator(end); Cap *cap; while((cap = end_getNext(capIt)) != NULL) { if(cap_getSequence(cap) != NULL) { Cap *adjacentCap = cap_getAdjacency(cap); assert(adjacentCap != NULL); End *adjacentEnd = end_getPositiveOrientation(cap_getEnd(adjacentCap)); stSortedSet_insert(ends, adjacentEnd); int64_t adjacencyLength = cap_getCoordinate(cap) - cap_getCoordinate(adjacentCap); if(adjacencyLength < 0) { adjacencyLength *= -1; } assert(adjacencyLength >= 1); if(adjacencyLength >= maxAdjacencyLength) { maxAdjacencyLength = adjacencyLength; } } } end_destructInstanceIterator(capIt); totalEdges += stSortedSet_size(ends); if(stSortedSet_search(ends, end) != NULL) { //This ensures we count self edges twice, so that the division works. totalEdges += 1; } stSortedSet_destruct(ends); } assert(totalEdges % 2 == 0); flower_destructEndIterator(endIt); Flower_GroupIterator *groupIt = flower_getGroupIterator(flower); Group *group; while((group = flower_getNextGroup(groupIt)) != NULL) { if(group_getLink(group) != NULL) { totalLinkGroups++; } } flower_destructGroupIterator(groupIt); printf("flower name: %" PRIi64 " total bases: %" PRIi64 " total-ends: %" PRIi64 " total-caps: %" PRIi64 " max-end-degree: %" PRIi64 " max-adjacency-length: %" PRIi64 " total-blocks: %" PRIi64 " total-groups: %" PRIi64 " total-edges: %" PRIi64 " total-free-ends: %" PRIi64 " total-attached-ends: %" PRIi64 " total-chains: %" PRIi64 " total-link groups: %" PRIi64 "\n", flower_getName(flower), totalBases, totalEnds, totalCaps, maxEndDegree, maxAdjacencyLength, totalBlocks, totalGroups, totalEdges/2, totalFreeEnds, totalAttachedEnds, totalChains, totalLinkGroups); return 0; }
int64_t block_getInstanceNumber(Block *block) { return stSortedSet_size(block->blockContents->segments); }
int64_t flower_getCapNumber(Flower *flower) { return stSortedSet_size(flower->caps); }
void writeEndAlignmentToDisk(End *end, stSortedSet *endAlignment, FILE *fileHandle) { fprintf(fileHandle, "%s %" PRIi64 "\n", cactusMisc_nameToStringStatic(end_getName(end)), stSortedSet_size(endAlignment)); stSortedSetIterator *it = stSortedSet_getIterator(endAlignment); AlignedPair *aP; while((aP = stSortedSet_getNext(it)) != NULL) { fprintf(fileHandle, "%" PRIi64 " %" PRIi64 " %i %" PRIi64 " ", aP->subsequenceIdentifier, aP->position, aP->strand, aP->score); aP = aP->reverse; fprintf(fileHandle, "%" PRIi64 " %" PRIi64 " %i %" PRIi64 "\n", aP->subsequenceIdentifier, aP->position, aP->strand, aP->score); } stSortedSet_destructIterator(it); }
int64_t flower_getEndNumber(Flower *flower) { return stSortedSet_size(flower->ends); }