@@ -12,8 +12,22 @@ use faer::linalg::solvers::{PartialPivLu, Solve};
1212use faer:: perm:: PermRef ;
1313use la_stack:: { DEFAULT_PIVOT_TOL , Matrix , Vector } ;
1414use pastey:: paste;
15+ use std:: fmt:: Display ;
1516use std:: hint:: black_box;
1617
18+ /// Return a successful benchmark operation result or panic with the named operation.
19+ fn require_ok < T , E : Display > ( result : Result < T , E > , operation : & str ) -> T {
20+ match result {
21+ Ok ( value) => value,
22+ Err ( err) => panic ! ( "{operation} failed: {err}" ) ,
23+ }
24+ }
25+
26+ /// Return a present third-party benchmark result or panic with the named operation.
27+ fn require_some < T > ( value : Option < T > , operation : & str ) -> T {
28+ value. unwrap_or_else ( || panic ! ( "{operation} returned no result" ) )
29+ }
30+
1731fn faer_perm_sign ( p : PermRef < ' _ , usize > ) -> f64 {
1832 // Sign(det(P)) for a permutation matrix P is +1 for even permutations, -1 for odd.
1933 // Parity can be computed from the number of cycles:
@@ -145,9 +159,7 @@ macro_rules! gen_vs_linalg_benches_for_dim {
145159 let fv2 = faer:: Mat :: <f64 >:: from_fn( $d, 1 , |i, _| vector_entry( i, 1.0 ) ) ;
146160
147161 // Precompute LU once for solve-only / det-only benchmarks.
148- let a_lu = a
149- . lu( DEFAULT_PIVOT_TOL )
150- . expect( "matrix should be non-singular" ) ;
162+ let a_lu = require_ok( a. lu( DEFAULT_PIVOT_TOL ) , "precomputed la_stack LU" ) ;
151163 let na_lu = na. clone( ) . lu( ) ;
152164 let fa_lu = fa. partial_piv_lu( ) ;
153165
@@ -156,13 +168,11 @@ macro_rules! gen_vs_linalg_benches_for_dim {
156168 // === Determinant via LU (factor + det) ===
157169 [ <group_d $d>] . bench_function( "la_stack_det_via_lu" , |bencher| {
158170 bencher. iter( || {
159- let lu = black_box( a)
160- . lu( DEFAULT_PIVOT_TOL )
161- . expect( "matrix should be non-singular" ) ;
162- let det = match lu. det( ) {
163- Ok ( det) => det,
164- Err ( err) => panic!( "finite benchmark matrix determinant failed: {err}" ) ,
165- } ;
171+ let lu = require_ok(
172+ black_box( a) . lu( DEFAULT_PIVOT_TOL ) ,
173+ "la_stack LU factorization" ,
174+ ) ;
175+ let det = require_ok( lu. det( ) , "la_stack LU determinant" ) ;
166176 black_box( det) ;
167177 } ) ;
168178 } ) ;
@@ -186,17 +196,18 @@ macro_rules! gen_vs_linalg_benches_for_dim {
186196 // === Determinant via det() (closed-form for D≤4, LU for D≥5) ===
187197 [ <group_d $d>] . bench_function( "la_stack_det" , |bencher| {
188198 bencher. iter( || {
189- let det = black_box( a) . det( ) . expect ( "matrix should be non-singular ") ;
199+ let det = require_ok ( black_box( a) . det( ) , "la_stack determinant ") ;
190200 black_box( det) ;
191201 } ) ;
192202 } ) ;
193203
194204 // === LU factorization ===
195205 [ <group_d $d>] . bench_function( "la_stack_lu" , |bencher| {
196206 bencher. iter( || {
197- let lu = black_box( a)
198- . lu( DEFAULT_PIVOT_TOL )
199- . expect( "matrix should be non-singular" ) ;
207+ let lu = require_ok(
208+ black_box( a) . lu( DEFAULT_PIVOT_TOL ) ,
209+ "la_stack LU factorization" ,
210+ ) ;
200211 let _ = black_box( lu) ;
201212 } ) ;
202213 } ) ;
@@ -218,22 +229,22 @@ macro_rules! gen_vs_linalg_benches_for_dim {
218229 // === LU solve (factor + solve) ===
219230 [ <group_d $d>] . bench_function( "la_stack_lu_solve" , |bencher| {
220231 bencher. iter( || {
221- let lu = black_box( a)
222- . lu( DEFAULT_PIVOT_TOL )
223- . expect( "matrix should be non-singular" ) ;
224- let x = lu
225- . solve_vec( black_box( rhs) )
226- . expect( "solve should succeed" ) ;
232+ let lu = require_ok(
233+ black_box( a) . lu( DEFAULT_PIVOT_TOL ) ,
234+ "la_stack LU factorization" ,
235+ ) ;
236+ let x = require_ok(
237+ lu. solve_vec( black_box( rhs) ) ,
238+ "la_stack LU solve" ,
239+ ) ;
227240 let _ = black_box( x) ;
228241 } ) ;
229242 } ) ;
230243
231244 [ <group_d $d>] . bench_function( "nalgebra_lu_solve" , |bencher| {
232245 bencher. iter( || {
233246 let lu = black_box( na. clone( ) ) . lu( ) ;
234- let x = lu
235- . solve( black_box( & nrhs) )
236- . expect( "solve should succeed" ) ;
247+ let x = require_some( lu. solve( black_box( & nrhs) ) , "nalgebra LU solve" ) ;
237248 black_box( x) ;
238249 } ) ;
239250 } ) ;
@@ -249,18 +260,20 @@ macro_rules! gen_vs_linalg_benches_for_dim {
249260 // === Solve using a precomputed LU ===
250261 [ <group_d $d>] . bench_function( "la_stack_solve_from_lu" , |bencher| {
251262 bencher. iter( || {
252- let x = a_lu
253- . solve_vec( black_box( rhs) )
254- . expect( "solve should succeed" ) ;
263+ let x = require_ok(
264+ a_lu. solve_vec( black_box( rhs) ) ,
265+ "precomputed la_stack LU solve" ,
266+ ) ;
255267 let _ = black_box( x) ;
256268 } ) ;
257269 } ) ;
258270
259271 [ <group_d $d>] . bench_function( "nalgebra_solve_from_lu" , |bencher| {
260272 bencher. iter( || {
261- let x = na_lu
262- . solve( black_box( & nrhs) )
263- . expect( "solve should succeed" ) ;
273+ let x = require_some(
274+ na_lu. solve( black_box( & nrhs) ) ,
275+ "precomputed nalgebra LU solve" ,
276+ ) ;
264277 black_box( x) ;
265278 } ) ;
266279 } ) ;
@@ -275,10 +288,7 @@ macro_rules! gen_vs_linalg_benches_for_dim {
275288 // === Determinant from a precomputed LU ===
276289 [ <group_d $d>] . bench_function( "la_stack_det_from_lu" , |bencher| {
277290 bencher. iter( || {
278- let det = match a_lu. det( ) {
279- Ok ( det) => det,
280- Err ( err) => panic!( "finite benchmark matrix determinant failed: {err}" ) ,
281- } ;
291+ let det = require_ok( a_lu. det( ) , "precomputed la_stack LU determinant" ) ;
282292 black_box( det) ;
283293 } ) ;
284294 } ) ;
@@ -300,7 +310,7 @@ macro_rules! gen_vs_linalg_benches_for_dim {
300310 // === Vector dot product ===
301311 [ <group_d $d>] . bench_function( "la_stack_dot" , |bencher| {
302312 bencher. iter( || {
303- let result = black_box( v1) . dot( black_box( v2) ) . unwrap ( ) ;
313+ let result = require_ok ( black_box( v1) . dot( black_box( v2) ) , "la_stack dot" ) ;
304314 black_box( result) ;
305315 } ) ;
306316 } ) ;
@@ -327,7 +337,7 @@ macro_rules! gen_vs_linalg_benches_for_dim {
327337 // === Vector norm squared ===
328338 [ <group_d $d>] . bench_function( "la_stack_norm2_sq" , |bencher| {
329339 bencher. iter( || {
330- let result = black_box( v1) . norm2_sq( ) . unwrap ( ) ;
340+ let result = require_ok ( black_box( v1) . norm2_sq( ) , "la_stack norm2_sq" ) ;
331341 black_box( result) ;
332342 } ) ;
333343 } ) ;
@@ -354,7 +364,7 @@ macro_rules! gen_vs_linalg_benches_for_dim {
354364 // === Matrix infinity norm (max absolute row sum) ===
355365 [ <group_d $d>] . bench_function( "la_stack_inf_norm" , |bencher| {
356366 bencher. iter( || {
357- let result = black_box( a) . inf_norm( ) . unwrap ( ) ;
367+ let result = require_ok ( black_box( a) . inf_norm( ) , "la_stack inf_norm" ) ;
358368 black_box( result) ;
359369 } ) ;
360370 } ) ;
0 commit comments