use crate::error::SolverError;
use crate::types::{
Algorithm, ComplexityEstimate, ComputeBudget, CsrMatrix, SolverResult, SparsityProfile,
};
pub trait SolverEngine: Send + Sync {
fn solve(
&self,
matrix: &CsrMatrix<f64>,
rhs: &[f64],
budget: &ComputeBudget,
) -> Result<SolverResult, SolverError>;
fn estimate_complexity(&self, profile: &SparsityProfile, n: usize) -> ComplexityEstimate;
fn algorithm(&self) -> Algorithm;
}
pub trait SparseLaplacianSolver: SolverEngine {
fn solve_laplacian(
&self,
laplacian: &CsrMatrix<f64>,
rhs: &[f64],
budget: &ComputeBudget,
) -> Result<SolverResult, SolverError>;
fn effective_resistance(
&self,
laplacian: &CsrMatrix<f64>,
source: usize,
target: usize,
budget: &ComputeBudget,
) -> Result<f64, SolverError>;
}
pub trait SublinearPageRank: Send + Sync {
fn ppr(
&self,
matrix: &CsrMatrix<f64>,
source: usize,
alpha: f64,
epsilon: f64,
) -> Result<Vec<(usize, f64)>, SolverError>;
fn ppr_multi_seed(
&self,
matrix: &CsrMatrix<f64>,
seeds: &[(usize, f64)],
alpha: f64,
epsilon: f64,
) -> Result<Vec<(usize, f64)>, SolverError>;
}