Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ unsafe_code = "forbid"
missing_docs = { level = "deny", priority = 0 }
dead_code = { level = "deny", priority = 0 }
unreachable_pub = { level = "deny", priority = 0 }
unexpected_cfgs = { level = "deny", priority = 0, check-cfg = [ 'cfg(docsrs)', 'cfg(la_stack_pre_rational_input_api)' ] }
unexpected_cfgs = { level = "deny", priority = 0, check-cfg = [ 'cfg(docsrs)' ] }

[workspace.lints.rustdoc]
bare_urls = "deny"
Expand Down
4 changes: 0 additions & 4 deletions benches/common/exact.rs
Original file line number Diff line number Diff line change
Expand Up @@ -598,10 +598,6 @@ pub fn validate_exact_fixture<const D: usize>(input: ExactInput<D>) -> Validated
.matrix
.solve_exact(input.rhs)
.or_abort("exact solve oracle check");
// Historical releases return the rational array directly instead of a wrapper.
#[cfg(la_stack_pre_rational_input_api)]
let solution = &solution;
#[cfg(not(la_stack_pre_rational_input_api))]
let solution = solution.as_array();
assert_exact_residual(&input, solution);

Expand Down
50 changes: 1 addition & 49 deletions benches/common/vs_linalg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,58 +8,10 @@ use faer::linalg::solvers::{Ldlt as FaerLdlt, PartialPivLu};
use faer::perm::PermRef;
use nalgebra::SMatrix;

use la_stack::{LaError, Matrix, Tolerance, Vector};
use la_stack::{Matrix, Tolerance, Vector};

use crate::bench_utils::OrAbort;

/// Evaluate the squared norm through the current public API.
///
/// # Errors
///
/// Returns the library's typed error if squared-norm accumulation overflows.
#[cfg(not(la_stack_pre_rational_input_api))]
#[inline]
pub const fn la_stack_norm_squared<const D: usize>(vector: &Vector<D>) -> Result<f64, LaError> {
vector.norm_squared()
}

/// Evaluate the same squared norm through the pre-v0.4.6 method name.
///
/// This adapter preserves historical comparisons without adding library aliases.
///
/// # Errors
///
/// Returns the selected revision's typed error if squared-norm accumulation overflows.
#[cfg(la_stack_pre_rational_input_api)]
#[inline]
pub const fn la_stack_norm_squared<const D: usize>(vector: &Vector<D>) -> Result<f64, LaError> {
vector.norm2_sq()
}

/// Evaluate the matrix infinity norm through the current public API.
///
/// # Errors
///
/// Returns the library's typed error if an absolute row sum overflows.
#[cfg(not(la_stack_pre_rational_input_api))]
#[inline]
pub const fn la_stack_norm_inf<const D: usize>(matrix: &Matrix<D>) -> Result<f64, LaError> {
matrix.norm_inf()
}

/// Evaluate the same matrix infinity norm through the pre-v0.4.6 method name.
///
/// This adapter preserves historical comparisons without adding library aliases.
///
/// # Errors
///
/// Returns the selected revision's typed error if an absolute row sum overflows.
#[cfg(la_stack_pre_rational_input_api)]
#[inline]
pub const fn la_stack_norm_inf<const D: usize>(matrix: &Matrix<D>) -> Result<f64, LaError> {
matrix.inf_norm()
}

/// Return `det(P)` for faer's permutation representation.
///
/// Sign(det(P)) is +1 for even permutations and -1 for odd. Parity is computed
Expand Down
67 changes: 32 additions & 35 deletions benches/comparison/tests/vs_linalg_inputs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,10 @@ use vs_linalg_common::{
LuSolveScenario, make_balanced_dynamic_range_rows, validated_lu_solve_input,
};
use vs_linalg_common::{
PreparedFaerLuDet, faer_det_from_ldlt, faer_perm_sign, la_stack_norm_inf,
la_stack_norm_squared, make_ill_conditioned_matrix_rows, make_matrix_rows,
make_pivoting_matrix_rows, make_vector_array, matrix_entry, nalgebra_inf_norm, vector_entry,
PreparedFaerLuDet, faer_det_from_ldlt, faer_perm_sign, make_ill_conditioned_matrix_rows,
make_matrix_rows, make_pivoting_matrix_rows, make_vector_array, matrix_entry,
nalgebra_inf_norm, vector_entry,
};
#[cfg(not(la_stack_pre_rational_input_api))]
use vs_linalg_common::{
delaunay_scaled_norm, iterative_hypot, make_norm_descending_array,
make_norm_repeated_scale_array, make_norm_sparse_array, make_norm_wide_dynamic_range_array,
Expand Down Expand Up @@ -221,44 +220,41 @@ fn assert_vector_operation_agreement<const D: usize>() {
assert_abs_diff_eq!(nv1.dot(&nv2), expected_dot, epsilon = 0.0);
assert_abs_diff_eq!(fa_dot, expected_dot, epsilon = 0.0);

let la_norm_squared = la_stack_norm_squared(&v1)
let la_norm_squared = v1
.norm_squared()
.unwrap_or_else(|err| panic!("la_stack norm_squared failed: {err}"));
assert_close("nalgebra_norm_squared", nv1.norm_squared(), la_norm_squared);
let fa_norm_squared = fv1.as_mat_ref().squared_norm_l2();
assert_close("faer_norm2_sq", fa_norm_squared, la_norm_squared);

#[cfg(not(la_stack_pre_rational_input_api))]
{
let la_norm = v1
let la_norm = v1
.norm()
.unwrap_or_else(|err| panic!("la_stack norm failed: {err}"));
assert_close(
"iterative_f64_hypot",
iterative_hypot(v1.as_array()),
la_norm,
);
assert_close(
"delaunay_scaled_norm",
delaunay_scaled_norm(v1.as_array()),
la_norm,
);
assert_close("nalgebra_norm", nv1.norm(), la_norm);
assert_close("faer_norm_l2", fv1.as_mat_ref().norm_l2(), la_norm);

for (scenario, values) in norm_scenarios::<D>() {
let vector = Vector::<D>::try_new(values).unwrap_or_else(|err| {
panic!("la_stack {scenario} norm scenario construction failed: {err}")
});
let expected = vector
.norm()
.unwrap_or_else(|err| panic!("la_stack norm failed: {err}"));
assert_close(
"iterative_f64_hypot",
iterative_hypot(v1.as_array()),
la_norm,
);
assert_close(
"delaunay_scaled_norm",
delaunay_scaled_norm(v1.as_array()),
la_norm,
);
assert_close("nalgebra_norm", nv1.norm(), la_norm);
assert_close("faer_norm_l2", fv1.as_mat_ref().norm_l2(), la_norm);

for (scenario, values) in norm_scenarios::<D>() {
let vector = Vector::<D>::try_new(values).unwrap_or_else(|err| {
panic!("la_stack {scenario} norm scenario construction failed: {err}")
});
let expected = vector
.norm()
.unwrap_or_else(|err| panic!("la_stack {scenario} norm failed: {err}"));
assert_close(scenario, iterative_hypot(&values), expected);
assert_close(scenario, delaunay_scaled_norm(&values), expected);
}
.unwrap_or_else(|err| panic!("la_stack {scenario} norm failed: {err}"));
assert_close(scenario, iterative_hypot(&values), expected);
assert_close(scenario, delaunay_scaled_norm(&values), expected);
}
}

#[cfg(not(la_stack_pre_rational_input_api))]
#[test]
fn norm_scenario_inputs_cover_distinct_branch_and_range_profiles() {
let descending = make_norm_descending_array::<8>();
Expand Down Expand Up @@ -430,8 +426,9 @@ fn assert_matrix_norm_inf_agreement<const D: usize>() {
let na = SMatrix::<f64, D, D>::from_fn(matrix_entry::<D>);
let fa = Mat::<f64>::from_fn(D, D, matrix_entry::<D>);

let la_norm =
la_stack_norm_inf(&a).unwrap_or_else(|err| panic!("la_stack norm_inf failed: {err}"));
let la_norm = a
.norm_inf()
.unwrap_or_else(|err| panic!("la_stack norm_inf failed: {err}"));
assert_close("nalgebra_inf_norm", nalgebra_inf_norm(&na), la_norm);
let mut fa_norm = 0.0;
for r in 0..D {
Expand Down
10 changes: 0 additions & 10 deletions benches/exact.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ use std::hint::black_box;

use criterion::{BenchmarkGroup, Criterion, Throughput, measurement::WallTime};

#[cfg(not(la_stack_pre_rational_input_api))]
use la_stack::ExactF64Conversion;
use la_stack::{Matrix, Vector};

Expand All @@ -44,11 +43,9 @@ mod bench_utils;
#[path = "common/exact.rs"]
pub mod exact_bench;

#[cfg(not(la_stack_pre_rational_input_api))]
#[path = "common/rational.rs"]
pub mod rational_bench;

#[cfg(not(la_stack_pre_rational_input_api))]
#[path = "common/exact_diagnostics.rs"]
pub mod exact_diagnostics;

Expand All @@ -58,12 +55,10 @@ use exact_bench::{
large_entries_3x3_input, make_matrix_rows, make_random_input_corpus, make_vector_array,
near_singular_3x3_input, validate_exact_fixture, validate_f64_determinant_benchmarks,
};
#[cfg(not(la_stack_pre_rational_input_api))]
use exact_diagnostics::{
ConversionKind, Det4Kind, EXPONENT_SPREADS, ExponentAxis, canonical_conversion_input,
exact_det4_input, exponent_spread_input,
};
#[cfg(not(la_stack_pre_rational_input_api))]
use rational_bench::{
RationalInputKind, rational_determinant_gaussian, rational_input, rational_solve_gaussian,
};
Expand Down Expand Up @@ -119,7 +114,6 @@ const CORPUS_AND_EXTREME_OPERATIONS: &[ExactOperation] = &[
/// Both algorithms measure a complete operation on borrowed, accepted input.
/// The consuming Gaussian references therefore make their required working
/// copies inside the timed closure, just as row clearing builds its workspace.
#[cfg(not(la_stack_pre_rational_input_api))]
fn bench_rational_input<const D: usize>(criterion: &mut Criterion, kind: RationalInputKind) {
let input = rational_input::<D>(kind);
let group_name = match kind {
Expand Down Expand Up @@ -379,7 +373,6 @@ macro_rules! gen_random_corpus_benches_for_dim {
}};
}

#[cfg(not(la_stack_pre_rational_input_api))]
fn bench_canonical_conversion<const D: usize>(c: &mut Criterion) {
for kind in ConversionKind::ALL {
let input = canonical_conversion_input::<D>(kind);
Expand All @@ -394,7 +387,6 @@ fn bench_canonical_conversion<const D: usize>(c: &mut Criterion) {
}
}

#[cfg(not(la_stack_pre_rational_input_api))]
fn bench_det4_diagnostics(c: &mut Criterion) {
for kind in Det4Kind::ALL {
let input = exact_det4_input(kind);
Expand All @@ -415,7 +407,6 @@ fn bench_det4_diagnostics(c: &mut Criterion) {
}
}

#[cfg(not(la_stack_pre_rational_input_api))]
fn bench_exponent_spreads<const D: usize>(c: &mut Criterion, axis: ExponentAxis) {
for spread in EXPONENT_SPREADS {
let input = exponent_spread_input::<D>(spread, axis);
Expand Down Expand Up @@ -455,7 +446,6 @@ fn main() {
gen_random_corpus_benches_for_dim!(&mut c, 5);
}

#[cfg(not(la_stack_pre_rational_input_api))]
{
bench_canonical_conversion::<2>(&mut c);
bench_canonical_conversion::<3>(&mut c);
Expand Down
27 changes: 11 additions & 16 deletions benches/vs_linalg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,12 @@ mod bench_utils;
pub mod vs_linalg_common;

use bench_utils::OrAbort;
#[cfg(not(la_stack_pre_rational_input_api))]
use vs_linalg_common::norm_scenarios;
use vs_linalg_common::{LuSolveScenario, validated_lu_solve_input};
use vs_linalg_common::{
PreparedFaerLuDet, delaunay_scaled_norm, faer_det_from_ldlt, iterative_hypot,
la_stack_norm_inf, la_stack_norm_squared, make_balanced_dynamic_range_rows,
make_ill_conditioned_matrix_rows, make_matrix_rows, make_pivoting_matrix_rows,
make_vector_array, matrix_entry, nalgebra_inf_norm, vector_entry,
make_balanced_dynamic_range_rows, make_ill_conditioned_matrix_rows, make_matrix_rows,
make_pivoting_matrix_rows, make_vector_array, matrix_entry, nalgebra_inf_norm, vector_entry,
};

/// Build the deterministic la-stack matrix shared by a benchmark family.
Expand Down Expand Up @@ -447,7 +445,9 @@ fn register_vector_benchmarks<const D: usize>(group: &mut BenchmarkGroup<'_, Wal

group.bench_function("la_stack_norm2_sq", |bencher| {
bencher.iter(|| {
let result = la_stack_norm_squared(black_box(&v1)).or_abort("la_stack norm_squared");
let result = black_box(&v1)
.norm_squared()
.or_abort("la_stack norm_squared");
black_box(result);
});
});
Expand All @@ -467,15 +467,12 @@ fn register_vector_benchmarks<const D: usize>(group: &mut BenchmarkGroup<'_, Wal
});
});

#[cfg(not(la_stack_pre_rational_input_api))]
{
group.bench_function("la_stack_norm2", |bencher| {
bencher.iter(|| {
let result = black_box(&v1).norm().or_abort("la_stack norm");
black_box(result);
});
group.bench_function("la_stack_norm2", |bencher| {
bencher.iter(|| {
let result = black_box(&v1).norm().or_abort("la_stack norm");
black_box(result);
});
}
});

group.bench_function("iterative_f64_hypot", |bencher| {
bencher.iter(|| {
Expand Down Expand Up @@ -507,7 +504,6 @@ fn register_vector_benchmarks<const D: usize>(group: &mut BenchmarkGroup<'_, Wal
}

/// Validate and register safe Euclidean-norm kernels across branch and range profiles.
#[cfg(not(la_stack_pre_rational_input_api))]
fn register_norm_scenario_benchmarks<const D: usize>(group: &mut BenchmarkGroup<'_, WallTime>) {
for (scenario, values) in norm_scenarios::<D>() {
let vector = Vector::try_new(values).or_abort("norm scenario vector construction");
Expand Down Expand Up @@ -562,7 +558,7 @@ fn register_matrix_norm_benchmarks<const D: usize>(group: &mut BenchmarkGroup<'_

group.bench_function("la_stack_inf_norm", |bencher| {
bencher.iter(|| {
let result = la_stack_norm_inf(black_box(&a)).or_abort("la_stack norm_inf");
let result = black_box(&a).norm_inf().or_abort("la_stack norm_inf");
black_box(result);
});
});
Expand Down Expand Up @@ -746,7 +742,6 @@ macro_rules! define_vs_linalg_benches_for_dim {
register_precomputed_lu_determinant_benchmarks::<$d>(&mut group);
register_precomputed_ldlt_determinant_benchmarks::<$d>(&mut group);
register_vector_benchmarks::<$d>(&mut group);
#[cfg(not(la_stack_pre_rational_input_api))]
register_norm_scenario_benchmarks::<$d>(&mut group);
register_matrix_norm_benchmarks::<$d>(&mut group);
$(
Expand Down
Loading
Loading