exponenta event banner

Создание пользовательского допуска

В этом примере показано, как создать пользовательский допуск, чтобы определить, имеют ли две последовательности ДНК расстояние Хэмминга в пределах указанного допуска. Для двух последовательностей ДНК одинаковой длины расстояние Хэмминга - это количество положений, в которых нуклеотиды (буквы) одной последовательности отличаются от другой.

В файле, DNA.m, в рабочей папке создайте простой класс для последовательности ДНК.

classdef DNA
    properties(SetAccess=immutable)
        Sequence
    end
    
    methods
        function dna = DNA(sequence)
            validLetters = ...
                sequence == 'A' | ...
                sequence == 'C' | ...
                sequence == 'T' | ...
                sequence == 'G';
            
            if ~all(validLetters(:))
                error('Sequence contained a letter not found in DNA.')
            end
            dna.Sequence = sequence;
        end
    end
end

В файле в рабочей папке создайте класс допуска, чтобы можно было проверить, что последовательности ДНК находятся на заданном расстоянии Хэмминга. Конструктору требуется Value свойство, определяющее максимальное расстояние Хэмминга.

classdef HammingDistance < matlab.unittest.constraints.Tolerance
    properties
        Value
    end
    
    methods
        function tolerance = HammingDistance(value)
            tolerance.Value = value;
        end
    end
end

В methods блок с HammingDistance определение класса, включите следующий метод, чтобы допуск поддерживал объекты ДНК. Классы допусков должны реализовывать supports способ.

    methods
        function tf = supports(~, value)
            tf = isa(value, 'DNA');
        end
    end

В methods блок с HammingDistance определение класса, включить следующий метод, который возвращает true или false. Классы допусков должны реализовывать satisfiedBy способ. В рамках тестирования этот метод используется для определения того, находятся ли два значения в пределах допуска.

    methods
        function tf = satisfiedBy(tolerance, actual, expected)
            if ~isSameSize(actual.Sequence, expected.Sequence)
                tf = false;
                return
            end
            tf = hammingDistance(actual.Sequence,expected.Sequence) <= tolerance.Value;
        end
    end

В HammingDistance.m , определите следующие вспомогательные функции вне classdef блок. isSameSize функция возвращает true если две последовательности ДНК имеют одинаковый размер, и hammingDistance функция возвращает расстояние Хэмминга между двумя последовательностями.

function tf = isSameSize(str1, str2)
tf = isequal(size(str1), size(str2));
end

function distance = hammingDistance(str1, str2)
distance = nnz(str1 ~= str2);
end

Функция возвращает Diagnostic с информацией о сравнении. В methods блок с HammingDistance определение класса, включить следующий метод, который возвращает StringDiagnostic. Классы допусков должны реализовывать getDiagosticFor способ.

    methods
        function diag = getDiagnosticFor(tolerance, actual, expected)
            import matlab.unittest.diagnostics.StringDiagnostic
            
            if ~isSameSize(actual.Sequence, expected.Sequence)
                str = 'The DNA sequences must be the same length.';
            else
                str = sprintf('%s%d.\n%s%d.', ...
                    'The DNA sequences have a Hamming distance of ', ...
                    hammingDistance(actual.Sequence, expected.Sequence), ...
                    'The allowable distance is ', ...
                    tolerance.Value);
            end
            diag = StringDiagnostic(str);
        end
    end

 Сводка по определению класса HammingDistance

В командной строке создайте TestCase для интерактивного тестирования.

import matlab.unittest.TestCase
import matlab.unittest.constraints.IsEqualTo

testCase = TestCase.forInteractiveUse;

Создайте два объекта ДНК.

sampleA = DNA('ACCTGAGTA');
sampleB = DNA('ACCACAGTA');

Убедитесь, что последовательности ДНК равны друг другу.

testCase.verifyThat(sampleA, IsEqualTo(sampleB))
Interactive verification failed.

---------------------
Framework Diagnostic:
---------------------
IsEqualTo failed.
--> ObjectComparator failed.
    --> The objects are not equal using "isequal".

Actual Object:
      DNA with properties:
    
        Sequence: 'ACCTGAGTA'
Expected Object:
      DNA with properties:
    
        Sequence: 'ACCACAGTA'

Убедитесь, что последовательности ДНК равны друг другу в пределах расстояния Хэмминга, равного 1.

testCase.verifyThat(sampleA, IsEqualTo(sampleB,...
    'Within', HammingDistance(1)))
Interactive verification failed.

---------------------
Framework Diagnostic:
---------------------
IsEqualTo failed.
--> ObjectComparator failed.
    --> The objects are not equal using "isequal".
    --> The DNA sequences have a Hamming distance of 2.
        The allowable distance is 1.

Actual Object:
      DNA with properties:
    
        Sequence: 'ACCTGAGTA'
Expected Object:
      DNA with properties:
    
        Sequence: 'ACCACAGTA'

Последовательности не равны друг другу в пределах допуска 1. Платформа тестирования отображает дополнительную диагностику из getDiagnosticFor способ.

Убедитесь, что последовательности ДНК равны друг другу в пределах расстояния Хэмминга, равного 2.

testCase.verifyThat(sampleA, IsEqualTo(sampleB,...
    'Within', HammingDistance(2)))
Interactive verification passed.

См. также