use crate::basis::{
BSplineBasisSpec, BSplineBoundaryConditions, BSplineIdentifiability, BSplineKnotSpec,
BasisBuildResult, BasisError, BasisMetadata, BasisPsiDerivativeResult,
BasisPsiSecondDerivativeResult, BasisWorkspace, CenterStrategy, CenterStrategyKind,
ConstantCurvatureBasisSpec, ConstantCurvatureIdentifiability, DuchonBasisSpec,
KroneckerFactoredBasis, MaternBasisSpec, MaternIdentifiability, MeasureJetBasisSpec,
MeasureJetFrozenQuadrature, MeasureJetIdentifiability, OneDimensionalBoundary,
PenaltyCandidate, PenaltyInfo, PenaltySource, SpatialIdentifiability, SphericalSplineBasisSpec,
SphericalSplineIdentifiability, ThinPlateBasisSpec, apply_sum_to_zero_constraint,
build_bspline_basis_1d, build_constant_curvature_basis,
build_constant_curvature_basis_kappa_derivatives, build_duchon_basiswithworkspace,
build_matern_basis_log_kappa_aniso_derivatives, build_matern_basis_log_kappa_derivatives,
build_matern_basiswithworkspace, build_matern_collocation_operator_matrices,
build_measure_jet_basis, build_measure_jet_basis_psi_derivatives, build_spherical_spline_basis,
build_thin_plate_basis, build_thin_plate_basis_log_kappa_derivatives, center_strategy_is_auto,
center_strategy_kind, center_strategy_num_centers, center_strategy_with_num_centers,
estimate_penalty_nullity, filter_active_penalty_candidates,
filter_active_penalty_candidates_with_ops, initial_aniso_contrasts,
orthogonality_transform_for_design, pairwise_distance_bounds, pairwise_distance_bounds_sampled,
points_in_aniso_y_space, select_centers_by_strategy,
};
use crate::construction::{
kronecker_logdet_and_derivatives, kronecker_marginal_eigensystems, kronecker_product,
};
use penalty_priors::{
realize_coefficient_groups, realize_keyed_penalty_block_gamma_priors,
realize_penalty_block_gamma_priors,
};
use crate::custom_family::{
BlockEffectiveJacobian, BlockGeometryDirectionalDerivative, BlockWorkingSet,
BlockwiseFitOptions, CustomFamily, CustomFamilyBlockPsiDerivative, CustomFamilyWarmStart,
ExactNewtonJointPsiTerms, ExactNewtonOuterObjective, FamilyEvaluation,
FamilyLinearizationState, ParameterBlockSpec, ParameterBlockState, PenaltyMatrix,
evaluate_custom_family_joint_hyper, evaluate_custom_family_joint_hyper_efs, fit_custom_family,
};
use crate::estimate::{
EstimationError, ExternalOptimOptions, FitInference, FitOptions, FittedLinkState, PenaltySpec,
UnifiedFitResult, UnifiedFitResultParts, fit_gamwith_heuristic_lambdas,
reml::DirectionalHyperParam,
};
use crate::faer_ndarray::{fast_ab, fast_atb, fast_atv};
use crate::families::strategy::{FamilyStrategy, strategy_for_spec};
use crate::matrix::{
BlockDesignOperator, CoefficientTransformOperator, DenseDesignOperator, DesignBlock,
DesignMatrix, LinearOperator, RandomEffectOperator, SymmetricMatrix,
TensorProductDesignOperator,
};
use crate::mixture_link::{
logit_inverse_link_jet5, state_from_beta_logisticspec, state_from_sasspec, state_fromspec,
};
use crate::pirls::LinearInequalityConstraints;
use crate::resource::MatrixMaterializationError;
use crate::types::{
InverseLink, LatentCLogLogState, LikelihoodSpec, MixtureLinkState, ResponseFamily,
SasLinkState, StandardLink,
};
use crate::util::quantile::quantile_from_sorted;
use faer::sparse::{SparseColMat, Triplet};
use ndarray::{Array1, Array2, ArrayView1, ArrayView2, ArrayViewMut2, Axis, s};
use serde::{Deserialize, Serialize};
use std::collections::{BTreeMap, BTreeSet};
use std::f64;
use std::fs::File;
use std::ops::Range;
use std::path::PathBuf;
use std::sync::atomic::AtomicUsize;
use std::sync::{Arc, Mutex};