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
Verifica Formale della Conversione da COO a CSR di Matrici Sparse (Articolo Invitato)
Questo articolo descrive una prova di correttezza verificata da macchina per la verifica di un programma C che converte matrici sparse in formato coordinato (COO) in formato di riga sparse compresso (CSR). L'algoritmo classico (ordinamento lessicografico delle voci COO per riga e colonna; riempimento degli array CSR da sinistra a destra) è conciso ma presenta invarianti piuttosto complessi. L'articolo presenta una metodologia bottom-up per derivare gli invarianti dal programma.
Problema Centrale: Le matrici sparse sono ampiamente utilizzate nel calcolo numerico, ma gli algoritmi di conversione di matrici sparse esistenti mancano di verifica formale e potrebbero contenere errori difficili da rilevare
Importanza: La moltiplicazione matrice-vettore sparse è un'operazione fondamentale nei metodi numerici; una conversione errata comporta il fallimento dell'intera catena di calcolo
Limitazioni Attuali: I metodi di verifica tradizionali si basano su test di regressione e simili, non fornendo garanzie matematiche di correttezza
Motivazione della Ricerca: Attraverso prove formali verificate da macchina, garantire la correttezza assoluta della conversione da COO a CSR, gettando le basi per software numerico verificabile
Prima Prova Verificata da Macchina della Correttezza della Conversione da COO a CSR: Utilizzo di Verifiable Software Toolchain (VST) e dell'assistente di prova Coq
Metodologia Innovativa di Derivazione degli Invarianti di Ciclo: Propone un approccio bottom-up che deriva complessi invarianti di ciclo dalle proprietà che il programma deve soddisfare
Separazione tra Strutture Dati e Ragionamento Approssimativo: Separa il ragionamento sulle strutture dati del programma C dal ragionamento sull'approssimazione in virgola mobile, semplificando la complessità della verifica
Componenti di Verifica Componibili: Fornisce moduli di conversione di matrici sparse verificati e riutilizzabili in sistemi di verifica più ampi
Scoperta di Errori Pratici: Durante il processo di prova, scopre e corregge 5 errori di programma (4 errori off-by-one e 1 errore complesso di gestione di interi senza segno)
Input: Matrice sparse COO - contiene dimensioni rows×cols e n triple di coordinate (row_indk, col_indk, valk)
Output: Matrice sparse CSR - contiene tre array unidimensionali (val, col_ind, row_ptr)
Vincoli: Mantenere l'equivalenza semantica della matrice matematica, gestire correttamente la somma in virgola mobile delle voci duplicate
struct csr_matrix *coo_to_csr_matrix(struct coo_matrix *p) {
// 1. Ordinamento lessicografico delle voci COO per (riga, colonna)
coo_quicksort(p, 0, n);
// 2. Conteggio del numero di coppie di coordinate non duplicate
k = coo_count(p);
// 3. Allocazione dello spazio per gli array CSR
// 4. Iterazione attraverso le voci COO ordinate, costruzione della struttura CSR
for (i=0; i<n; i++) {
// Gestione di voci duplicate, nuove colonne, nuove righe, ecc.
}
}
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.
L'innovazione chiave è la relazione partial_CSR i r coo ROWPTR COLIND VAL, che rappresenta lo stato CSR parziale quando si elabora l'i-esima voce COO e la r-esima riga.
Verifica Stratificata: Prima prova che il programma C implementa la specifica di basso livello, poi prova la correttezza matematica della specifica di basso livello
Progettazione Modulare: Separazione del ragionamento sulle strutture dati dal ragionamento sull'approssimazione in virgola mobile
Derivazione Bottom-Up: Derivazione degli invarianti di ciclo dai requisiti di prova della logica di Hoare del programma
Riproducibilità Bit-for-Bit: La specifica attuale consente diversi ordini di somma in virgola mobile, non garantendo la riproducibilità a livello di bit
Considerazioni di Prestazione: L'algoritmo verificato non è ottimizzato per le prestazioni
Funzionalità di Riassemblaggio: Non implementa versioni ottimizzate che riutilizzano la struttura CSR
Costo di Verifica: Un programma relativamente breve richiede una quantità sostanziale di lavoro di verifica
Profondità Tecnica: Affronta molteplici sfide tecniche negli algoritmi di matrici sparse, inclusi aritmetica in virgola mobile, gestione della memoria, flusso di controllo complesso
Innovazione Metodologica: Il metodo di derivazione degli invarianti bottom-up fornisce un paradigma replicabile per verifiche simili
Valore Pratico: La scoperta di errori effettivi dimostra i benefici pratici della verifica formale
Qualità Ingegneristica: La progettazione modulare e la struttura di specifica chiara riflettono ingegneria di verifica di alta qualità
Completezza: Verifica end-to-end dal codice C alla specifica matematica
I riferimenti bibliografici chiave citati in questo articolo includono:
Barrett et al. (1994): Templates for the Solution of Linear Systems - Riferimento classico per algoritmi di matrici sparse
Appel & Kellison (2024): VCFloat2 - Strumento di analisi di errori in virgola mobile
Cao et al. (2018): VST-Floyd - Strumento di verifica con logica di separazione
Kellison et al. (2023): LAProof - Libreria di prova formale per programmi di algebra lineare
Sintesi: Questo articolo dimostra la fattibilità della verifica formale completa di algoritmi numerici complessi, propone una metodologia di verifica pratica e fornisce importanti contributi allo sviluppo di software di calcolo scientifico affidabile. Sebbene il costo di verifica sia elevato, il valore della scoperta di errori effettivi e la guida metodologica fornita lo rendono un lavoro importante nel campo.