Formal Verification of COO to CSR Sparse Matrix Conversion (Invited Paper)
Appel
We describe a machine-checked correctness proof of a C program that converts a coordinate-form (COO) sparse matrix to a compressed-sparse-row (CSR) matrix. The classic algorithm (sort the COO entries in lexicographic order by row,column; fill in the CSR arrays left to right) is concise but has rather intricate invariants. We illustrate a bottom-up methodology for deriving the invariants from the program.
academic
Формальная верификация преобразования разреженных матриц из формата COO в CSR (Приглашённая статья)
В данной статье описывается машинно-проверяемое доказательство корректности для верификации программы на языке C, которая преобразует разреженные матрицы из координатного формата (COO) в формат сжатых разреженных строк (CSR). Классический алгоритм (сортировка записей COO в лексикографическом порядке по строкам и столбцам; заполнение массивов CSR слева направо), хотя и лаконичен, обладает весьма сложными инвариантами. В статье представлена методология восходящего подхода к выведению инвариантов из программы.
Основная проблема: Разреженные матрицы широко применяются в численных вычислениях, однако существующие алгоритмы преобразования разреженных матриц лишены формальной верификации и могут содержать трудноуловимые ошибки
Значимость: Умножение разреженной матрицы на вектор является фундаментальной операцией в численных методах; ошибка при преобразовании приводит к отказу всей вычислительной цепи
Существующие ограничения: Традиционные методы верификации полагаются на регрессионное тестирование и подобные подходы, которые не могут обеспечить математическую гарантию корректности
Исследовательская мотивация: Посредством машинно-проверяемого формального доказательства обеспечить абсолютную корректность преобразования COO в CSR, заложив основу для верифицируемого научного программного обеспечения
Представление разреженных матриц: Формат COO удобен для построения, формат CSR удобен для операций умножения
Анализ методом конечных элементов: Каждая внутренняя вершина в сетке порождает несколько координатных кортежей, естественным образом создавая повторяющиеся записи
Численная точность: Некоммутативность операций с плавающей точкой делает порядок суммирования повторяющихся записей влияющим на результат
Первое машинно-проверяемое доказательство корректности преобразования COO в CSR: Использование Verifiable Software Toolchain (VST) и помощника по доказательствам Coq
Инновационная методология выведения инвариантов цикла: Предложен восходящий подход, выводящий сложные инварианты цикла из свойств, которые должна удовлетворять программа
Разделение рассуждений о структурах данных и приближённых вычислениях: Отделение рассуждений о структурах данных программы на C от рассуждений об приближениях с плавающей точкой, упрощающее сложность верификации
Компонуемые верифицированные компоненты: Предоставление верифицированного модуля преобразования разреженных матриц, пригодного для повторного использования в более крупных верифицированных системах
Обнаружение практических ошибок: Обнаружение и исправление 5 ошибок в программе в процессе доказательства (4 ошибки типа off-by-one и 1 ошибка обработки беззнаковых целых чисел)
Record coo_matrix (t: type) := {
coo_rows: Z;
coo_cols: Z;
coo_entries: list (Z * Z * ftype t)
}.
Record csr_matrix {t: type} := {
csr_cols: Z;
csr_vals: list (ftype t);
csr_col_ind: list Z;
csr_row_ptr: list Z;
csr_rows: Z := Zlength (csr_row_ptr) - 1
}.
Inductive sum_any {t}: list (ftype t) → ftype t → Prop :=
| Sum_Any_0: sum_any nil (Zconst t 0)
| Sum_Any_1: ∀ x, sum_any [x] x
| Sum_Any_split: ∀ al bl a b, sum_any al a → sum_any bl b →
sum_any (al++bl) (BPLUS a b)
| Sum_Any_perm: ∀ al bl s, Permutation al bl → sum_any al s → sum_any bl s.
Ключевая инновация — отношение partial_CSR i r coo ROWPTR COLIND VAL, представляющее частичное состояние CSR при обработке i-й записи COO и r-й строки.
Многоуровневая верификация: Сначала доказывается, что программа на C реализует низкоуровневую спецификацию, затем доказывается математическая корректность низкоуровневой спецификации
Модульное проектирование: Разделение рассуждений о структурах данных и рассуждений об приближениях с плавающей точкой
Восходящее выведение: Обратный вывод инвариантов цикла из требований доказательства логики Хоара программы
Воспроизводимость на уровне битов: Текущая спецификация допускает различные порядки суммирования с плавающей точкой, не гарантируя воспроизводимость на уровне битов
Соображения производительности: Верифицированный алгоритм не оптимизирован для производительности
Функциональность переупаковки: Не реализована оптимизированная версия с повторным использованием структуры CSR
Стоимость верификации: Относительно короткая программа требует значительного объёма верификационной работы
Техническая глубина: Решение множества технических проблем в алгоритмах разреженных матриц, включая операции с плавающей точкой, управление памятью и сложные потоки управления
Методологические инновации: Восходящий метод выведения инвариантов предоставляет воспроизводимую парадигму для подобных верификаций
Практическая ценность: Обнаружение практических ошибок демонстрирует реальную пользу формальной верификации
Качество инженерии: Модульное проектирование и ясная структура спецификации отражают высокое качество верификационной инженерии
Полнота: Сквозная верификация от кода на C к математической спецификации
Barrett et al. (1994): Templates for the Solution of Linear Systems — классический справочник по алгоритмам разреженных матриц
Appel & Kellison (2024): VCFloat2 — инструмент анализа ошибок с плавающей точкой
Cao et al. (2018): VST-Floyd — инструмент верификации логики разделения
Kellison et al. (2023): LAProof — библиотека формального доказательства для программ линейной алгебры
Резюме: Данная статья демонстрирует осуществимость полной формальной верификации сложных численных алгоритмов, предлагает практическую методологию верификации и вносит важный вклад в развитие надёжного научного вычислительного программного обеспечения. Несмотря на высокие затраты на верификацию, её ценность в обнаружении практических ошибок и предоставленное методологическое руководство делают её важной работой в данной области.