From 5d03d249ea5f0fff6b23e1f7d30494434bd4903b Mon Sep 17 00:00:00 2001 From: Mathieu Fourment Date: Fri, 27 Nov 2015 15:40:06 +1100 Subject: [PATCH] Fixed a major leak in MFDistanceMatrix and its subclass. MFDistanceMatrixOperation is now allowed to be cancelled. --- Seqotron/MFDistanceMatrix.m | 10 +++++----- Seqotron/MFDistanceMatrixOperation.m | 14 ++++++++++++-- Seqotron/MFJukeCantorDistanceMatrix.m | 10 +++++----- Seqotron/MFK83DistanceMatrix.m | 10 +++++----- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/Seqotron/MFDistanceMatrix.m b/Seqotron/MFDistanceMatrix.m index e0a16ad..8f7c30a 100755 --- a/Seqotron/MFDistanceMatrix.m +++ b/Seqotron/MFDistanceMatrix.m @@ -54,14 +54,14 @@ -(void)dealloc{ - (float)calculatePairwiseDistanceBetween:(MFSequence*)sequence1 and:(MFSequence*)sequence2{ NSUInteger d = 0; NSUInteger n = 0; - const char *c1 = [[sequence1 sequence]UTF8String]; - const char *c2 = [[sequence2 sequence]UTF8String]; MFDataType *dataType = sequence1.dataType; NSUInteger dimension = [sequence1 length]; - + char c1,c2; for ( NSUInteger k = 0; k < dimension; k++ ) { - if( [dataType isKnownChar:c1[k]] && [dataType isKnownChar:c2[k]] ){ - if(c1[k] != c2[k] ){ + c1 = [[sequence1 sequence ]characterAtIndex:k]; + c2 = [[sequence2 sequence ]characterAtIndex:k]; + if( [dataType isKnownChar:c1] && [dataType isKnownChar:c2] ){ + if(c1 != c2 ){ d++; } n++; diff --git a/Seqotron/MFDistanceMatrixOperation.m b/Seqotron/MFDistanceMatrixOperation.m index 4089aff..df05e2f 100644 --- a/Seqotron/MFDistanceMatrixOperation.m +++ b/Seqotron/MFDistanceMatrixOperation.m @@ -83,8 +83,18 @@ -(void)main{ // [self.delegate operation:self setDescription:self.description]; // }); // } - - [_matrix calculateDistances]; + float **matrix = [_matrix floatMatrix]; + NSUInteger dimension = [_sequences count]; + for ( NSUInteger i = 0; i < dimension; i++ ) { + MFSequence *seq1 = [_sequences objectAtIndex:i]; + + for ( NSUInteger j = i+1; j < dimension; j++ ) { + MFSequence *seq2 = [_sequences objectAtIndex:j]; + matrix[i][j] = matrix[j][i] = [_matrix calculatePairwiseDistanceBetween:seq1 and:seq2]; + } + if( [self isCancelled] )break; + } + //[_matrix calculateDistances]; // [(NSObject *)self.delegate performSelectorOnMainThread: @selector(distanceMatrixDidFinish:) // withObject: self diff --git a/Seqotron/MFJukeCantorDistanceMatrix.m b/Seqotron/MFJukeCantorDistanceMatrix.m index 5b01f9b..563cb84 100755 --- a/Seqotron/MFJukeCantorDistanceMatrix.m +++ b/Seqotron/MFJukeCantorDistanceMatrix.m @@ -28,14 +28,14 @@ @implementation MFJukeCantorDistanceMatrix - (float)calculatePairwiseDistanceBetween:(MFSequence*)sequence1 and:(MFSequence*)sequence2{ NSUInteger d = 0; NSUInteger n = 0; - const char *c1 = [[sequence1 sequence]UTF8String]; - const char *c2 = [[sequence2 sequence]UTF8String]; MFDataType *dataType = sequence1.dataType; NSUInteger dimension = [sequence1 length]; - + char c1,c2; for ( NSUInteger k = 0; k < dimension; k++ ) { - if( [dataType isKnownChar:c1[k]] && [dataType isKnownChar:c2[k]] ){ - if( c1[k] != c2[k] ){ + c1 = [[sequence1 sequence ]characterAtIndex:k]; + c2 = [[sequence2 sequence ]characterAtIndex:k]; + if( [dataType isKnownChar:c1] && [dataType isKnownChar:c2] ){ + if( c1 != c2 ){ d++; } n++; diff --git a/Seqotron/MFK83DistanceMatrix.m b/Seqotron/MFK83DistanceMatrix.m index dea9089..806a0f1 100644 --- a/Seqotron/MFK83DistanceMatrix.m +++ b/Seqotron/MFK83DistanceMatrix.m @@ -28,14 +28,14 @@ @implementation MFK83DistanceMatrix - (float)calculatePairwiseDistanceBetween:(MFSequence*)sequence1 and:(MFSequence*)sequence2{ float d = 0; NSUInteger n = 0; - const char *c1 = [[sequence1 sequence]UTF8String]; - const char *c2 = [[sequence2 sequence]UTF8String]; MFDataType *dataType = sequence1.dataType; NSUInteger dimension = [sequence1 length]; - + char c1,c2; for ( NSUInteger k = 0; k < dimension; k++ ) { - if( [dataType isKnownChar:c1[k]] && [dataType isKnownChar:c2[k]] ){ - if( c1[k] != c2[k] ){ + c1 = [[sequence1 sequence ]characterAtIndex:k]; + c2 = [[sequence2 sequence ]characterAtIndex:k]; + if( [dataType isKnownChar:c1] && [dataType isKnownChar:c2] ){ + if( c1 != c2 ){ d++; } n++;