Изменения

Поиск повторов в ДНК на основе ОСАМ

9034 байта добавлено, 20:57, 24 марта 2010
м
Нет описания правки
* Подсчитать сетку Гаусса (то есть, корни n+1-ой функции базиса).
* Подсчитать весовые и нормировочные коэффициенты.
 
=== Алгоритм разложения ===
«Наивный» вариант алгоритма разложения:
: <m>f_j(x_i)</m> — значение j-ой функции базиса в i-ой точке сетки.
: <m>r_j</m> — j-ый нормировочный коэффициент.
 
Оптимизированный для рекуррентных соотношений алгоритм разложения:
 
* Интерполировать выбранную подпоследовательность длины N > n на подсчитанную сетку алгоритмом «ближайшего соседа».
* В цикле по ''i = 1..n'':
** <m>c_i = 0</m>
* В цикле по ''i = 1..n'':
** Вычислить и сохранить в памяти все значения <m>f_j(x_i), j = 1 \ldots n</m> с помощью рекуррентных соотношений.
** В цикле по ''j = 1..n'':
*** <m>c_j = c_j + y_i \cdot f_j(x_i) \cdot r_j \cdot w_i</m>
 
Псевдокод оптимизированного с учётом векторных операций алгоритма разложения здесь не приведён по причине его объёма. Кратко можно описать два момента: во-первых, циклы сменены местами — внешний цикл идёт по коэффициентам разложения, а не по функциям базиса, и во-вторых, на всех этапах используются векторные операции — сложения, умножения, возведения в квадрат и т. п.
=== Оптимизация ===
Кроме того, ОСАМ позволяет и производить практически идеальное распараллеливание алгоритма по причине небольшого объёма необходимой памяти в случае, если не используется т. н. «индексация последовательности» — такой подход может быть полезен при вычислениях с массовым параллелизмом. ''Индексацией'' называется процесс предварительного разложения сравниваемой последовательности по выбранному ортогональному базису и сохранения в памяти всех векторов коэффициентов разложения для последующего использования. Достоинство индексации — отсутствие необходимости производить большой объём вычислений во вложенном цикле; её недостаток — существенное увеличение объёма используемой оперативной памяти и увеличение требований к пропускной способности памяти. Последнее особенно важно при массивно-параллельных вычислениях — отдельные процессоры, ядра или узлы кластера могут вообще не иметь общего доступа ко всей оперативной памяти системы, не говоря уже о существенном замедлении обмена данных между вычислителями и памятью в случае конкуретной работы с большой области памяти. Такая проблема присутствует даже на многоядерных стандартных настольных компьютерах и серверах нижнего класса — оперативная память обычно работает приблизительно со скоростью, равной четверти скорости процессоров и, начиная с определённого количества ядер/процессоров, индексация становится менее выгодной, чем могла бы быть, так как чипсет и оперативная память не могут обеспечить требуемую скорость обмена.
Тем не менее, на обычных ПК и серверах нижнего класса наличие индексации хотя бы одной последовательности всё равно выгодно, поэтому при реализации был выбран следующий подход: индексация одной последовательности и разложений разложение второй на лету. Соответственно, в любом случае — как в случае сравнения последовательности с самой собой, так и в случае сравнения двух последовательностей — вычисления коэффициентов разложения последовательностей происходят только 1 раз: первой при индексации, а второй во внешнем цикле.
Реальный выигрыш в производительности засчёт чисто программной оптимизации достигает 10-20 раз на стандартных двухъядерных процессорах архитектуры Core 2.
ippsMulC_64f(wn, -1, tn, n);
ippsSqrt_64f_I(tn, n);
 
И последний важный момент — принцип «дискриминантности». Напомним, что расстояние между двумя векторами коэффициентов разложения определяется как <m>\frac{|a-b|}{|a|+|b|}</m>, где <m>|x|=\sqrt{\sum {x}_{i}^{2}}</m> Принцип «дискриминантности» же гласит очевидную вещь: если <m>\frac{\sqrt{{\sum }_{i=0}^{k}{({a}_{i}-{b}_{i})}^{2}}}{|a|+|b|}> \varepsilon</m> уже при k < n, суммирование можно не продолжать, т.к. ''меньше'' ε сумма квадратов уже не станет. Эта идея также использовалась при оптимизации алгоритма. Однако здесь возникает определённое препятствие: суммирование с постоянными условными проверками не векторизуется, т.е., при подсчёте нормы с учётом принципа "дискриминантности" IPP использовать мы уже не можем. Но так как IPP даёт весьма неплохой прирост производительности, можно применить следующий нетривиальный ход: сначала суммировать до ''k = d'', где d - делитель n, больший 1, с использованием векторных операций, потом проверять, не превышен ли порог, потом до ''k = 2d'', потом до ''k = 3d'', и т.д.
 
=== Алгоритм с учётом индексации ===
 
С учётом выбранного подхода — индексации одной последовательности и разложения другой «на лету» — алгоритм принимает следующий вид:
 
* Загрузить входные файлы последовательностей.
* ''Подсчитать и сохранить в памяти коэффициенты разложения всех подпоследовательностей 1-ой последовательности по выбранному ОНБ.''
* ''Подсчитать и сохранить в памяти нормы всех векторов коэффициентов разложения этих подпоследовательностей.''
* По всем ''сохранённым коэффициентам разложения подпоследовательностей'' 1-ой последовательности:
** По всем подпоследовательностям 2-ой последовательности:
*** Подсчитать коэффициенты разложения подпоследовательности 2-ой последовательности по выбранному ОНБ.
*** Вычислить норму вектора коэффициентов разложения подпоследовательности 2-ой последовательности.
*** Подсчитать L<sub>2</sub>-расстояние между векторами коэффициентов разложения подпоследовательностей.
*** Поделить подсчитанное расстояние на сумму норм векторов коэффициентов.
*** Сохранить подсчитанное значение как (i, j)-ый элемент матрицы гомологии.
* Записать матрицу гомологии в выходной файл.
 
=== Алгоритм с учётом параллелизма ===
 
Изменения с учётом параллелизма тривиальны: наиболее внешние циклы разделяются на ''M'' частей и для обработки каждой части работы создаётся собственный поток. Далее главный поток приложения ожидает завершения всех созданных, т.е., ожидает окончания очередного этапа работы.
 
* Загрузить входные файлы последовательностей.
* ''Создать требуемое число M вычислительных потоков, далее, для каждого из них:''
** ''Подсчитать и сохранить в памяти коэффициенты разложения своей <m>\frac{1}{M}</m>-ой части подпоследовательностей 1-ой последовательности по выбранному ОНБ.''
** ''Подсчитать и сохранить в памяти нормы своей <m>\frac{1}{M}</m>-ой части векторов коэффициентов разложения этих подпоследовательностей.''
* ''Создать требуемое число M вычислительных потоков, далее, для каждого из них:''
** ''По своей <m>\frac{1}{M}</m>-ой части сохранённых коэффициентов разложения подпоследовательностей 1-ой последовательности'':
*** По всем подпоследовательностям 2-ой последовательности:
**** Подсчитать коэффициенты разложения подпоследовательности 2-ой последовательности по выбранному ОНБ.
**** Вычислить норму вектора коэффициентов разложения подпоследовательности 2-ой последовательности.
**** Подсчитать L<sub>2</sub>-расстояние между векторами коэффициентов разложения подпоследовательностей.
**** Поделить подсчитанное расстояние на сумму норм векторов коэффициентов.
**** Сохранить подсчитанное значение как (i, j)-ый элемент матрицы гомологии.
* Записать матрицу гомологии в выходной файл.
 
=== Сравнение векторов с учётом векторных операций и дискриминантности ===
 
* Вычислить относительный порог <m>l = (\varepsilon \cdot (s_1 + s_2))²</m>, где s<sub>1</sub> и s<sub>2</sub> — нормы векторов.
* Начальное значение ''f = 0''.
* В цикле:
** С помощью функции IPP <code>ippsNormDiffL2_64f</code> (или 32f, в зависимости от требуемой точности) вычислить норму разности очередных участков длины ''d'' сравниваемых векторов.
** Добавить к ''f'' квадрат полученного значения.
** Если ''f > l'', принять, что вектора «не подобны».
* Если цикл завершился без принятия того, что вектора «не подобны», принять, что вектора подобны.
=== Сравнение ОНБ ===
Ниже приводится табличка с замерами средней длины найденных повторов на различных базисах и части генома мыши длиной 1.5 млн нуклеотидов в качестве тестовых данных. Сравнение производилось при приблизительно равных количествах найденных «подобных» участков — 5000. При выбранных настройках минимально возможная найденная длина подобного участка — 3500 нуклеотидов.
<tab sep="tab" border="1" class="simpletable" head="topleft">
- Eps Среднее Медиана
Чебышева 1 рода .025 '''3978''' '''10000'''
Каковы выводы? По средней длине повтора лидирует базис Чебышев 1 рода, а базисы ДКП, ДСП и Фурье дают чрезвычайно похожие на него, практически идентичные, результаты. С небольшим отставанием следует базис Лежандра, далее — базис Чебышева 2 рода, а базисы Эрмита и Лагерра для поиска подобных участков не подходят вообще, чему есть простое математическое обоснование — оба они действуют на бесконечной полупрямой — либо <m>(0, +\inf)</m>, либо <m>(-\inf, +\inf)</m>. Вариантов значения медианной длины при этом было всего 2: 3500 (минимально возможная) или 10000. Медианная длина в данном случае отражает, фактически, «чистое» количество шума — мелких отрезков, и гласит, что приемлемый уровень шума дают базисы Чебышева 1 рода, ДКП, ДСП, Фурье и Лежандра.
[[Категория:УчёбаСтатьи]][[Категория:Биоинформатика]]