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
Formale Verifikation der COO-zu-CSR-Konvertierung von Sparse Matrices (Eingeladenes Papier)
Dieses Papier beschreibt einen maschinell überprüften Korrektheitsbeweis zur Verifikation eines C-Programms, das Sparse Matrices im Koordinatenformat (COO) in das komprimierte Sparse-Row-Format (CSR) konvertiert. Der klassische Algorithmus (Sortierung von COO-Einträgen nach lexikographischer Ordnung von Zeilen und Spalten; Füllung der CSR-Arrays von links nach rechts) ist zwar prägnant, weist jedoch erheblich komplexe Invarianten auf. Der Artikel präsentiert eine Bottom-up-Methodik zur Ableitung von Invarianten aus dem Programm.
Kernproblem: Sparse Matrices werden in der numerischen Berechnung weit verbreitet verwendet, aber bestehende Sparse-Matrix-Konvertierungsalgorithmen mangelt es an formaler Verifikation, was zu schwer zu findenden Fehlern führen kann
Bedeutung: Die Sparse-Matrix-Vektor-Multiplikation ist eine grundlegende Operation in numerischen Methoden; fehlerhafte Konvertierungen führen zum Versagen der gesamten Berechnungskette
Bestehende Einschränkungen: Traditionelle Verifikationsmethoden verlassen sich auf Regressionstests und ähnliche Mittel und können keine mathematische Korrektheit garantieren
Forschungsmotivation: Durch maschinell überprüfte formale Beweise die absolute Korrektheit der COO-zu-CSR-Konvertierung sicherstellen und damit eine Grundlage für verifizierbare numerische Software schaffen
Sparse-Matrix-Darstellung: COO-Format ist konstruktionsfreundlich, CSR-Format ist multiplikationsfreundlich
Finite-Element-Analyse: Jeder innere Knoten in einem Netz erzeugt mehrere Koordinaten-Tupel und produziert natürlicherweise doppelte Einträge
Numerische Genauigkeit: Die Nichtassoziativität von Gleitkommaoperationen macht die Summationsreihenfolge doppelter Einträge auswirkungsreich auf das Ergebnis
Erstmals maschinell überprüfter Korrektheitsbeweis für COO-zu-CSR-Konvertierung: Verwendung des Verifiable Software Toolchain (VST) und des Coq-Beweisassistenten
Innovative Methodik zur Ableitung von Schleifeninvarianten: Vorschlag einer Bottom-up-Methodik, die komplexe Schleifeninvarianten aus den Eigenschaften ableitet, die das Programm erfüllen muss
Trennung von Datenstruktur- und Approximationslogik: Trennung der Datenstrukturlogik von C-Programmen von der Gleitkomma-Approximationslogik zur Vereinfachung der Verifikationskomplexität
Zusammensetzbare Verifikationskomponenten: Bereitstellung eines verifizierten Sparse-Matrix-Konvertierungsmoduls, das in größeren Verifikationssystemen wiederverwendet werden kann
Praktische Fehlererkennung: Entdeckung und Behebung von 5 Programmfehlern während des Beweisprozesses (4 Off-by-one-Fehler und 1 Fehler bei der Behandlung von vorzeichenlosen Ganzzahlen)
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.
Die Schlüsselinnovation ist die partial_CSR i r coo ROWPTR COLIND VAL-Relation, die den partiellen CSR-Zustand bei der Verarbeitung des i-ten COO-Eintrags und der r-ten Zeile darstellt.
Schichtweise Verifikation: Zunächst Beweis, dass C-Programm Low-Level-Spezifikation implementiert, dann Beweis der mathematischen Korrektheit der Low-Level-Spezifikation
Modulares Design: Trennung von Datenstrukturlogik und Gleitkomma-Approximationslogik
Bottom-up-Ableitung: Rückwärts-Ableitung von Schleifeninvarianten aus Anforderungen des Hoare-Logik-Beweises des Programms
Wichtige Literaturquellen dieses Papiers umfassen:
Barrett et al. (1994): Templates for the Solution of Linear Systems – Klassische Referenz für Sparse-Matrix-Algorithmen
Appel & Kellison (2024): VCFloat2 – Tool zur Gleitkomma-Fehleranalyse
Cao et al. (2018): VST-Floyd – Verifikations-Tool für Separationslogik
Kellison et al. (2023): LAProof – Formale Beweis-Bibliothek für lineare Algebra-Programme
Zusammenfassung: Dieses Papier demonstriert die Machbarkeit vollständiger formaler Verifikation komplexer numerischer Algorithmen, präsentiert praktische Verifikationsmethodik und leistet wichtige Beiträge zur Entwicklung vertrauenswürdiger wissenschaftlicher Computersoftware. Obwohl die Verifikationskosten erheblich sind, machen der Wert der Fehlererkennung und die bereitgestellte methodologische Anleitung dies zu einem wichtigen Werk in diesem Bereich.