nacfahi 0.5.1

Simpler, but less error-prone API for `levenberg-marquardt` optimization crate
Documentation
use generic_array::GenericArray;
use generic_array_storage::Conv;
use num_traits::{Float, FloatConst};

use crate::models::{
    FitModel,
    basic::gaussian::common::{ErrorsNone, ErrorsSigma},
};

use super::SymmetricGenericGaussian;

#[doc(hidden)]
#[allow(missing_debug_implementations)]
pub struct GaussianErrResolver(());

#[doc(hidden)]
pub trait GaussianErrResolve<Scalar, const FIT_SIGMA: bool>
where
    SymmetricGenericGaussian<Scalar, FIT_SIGMA>: FitModel,
{
    type T;

    fn create(
        errors: GenericArray<
            Scalar,
            <<SymmetricGenericGaussian<Scalar, FIT_SIGMA> as FitModel>::ParamCount as Conv>::TNum,
        >,
    ) -> Self::T;
}

impl<Scalar: Float + FloatConst> GaussianErrResolve<Scalar, false> for GaussianErrResolver {
    type T = ErrorsNone<Scalar>;

    fn create(
        errors: generic_array::GenericArray<
                Scalar,
                <<SymmetricGenericGaussian<Scalar, false> as FitModel>::ParamCount as generic_array_storage::Conv>::TNum,
            >,
    ) -> Self::T {
        let [a_err, x_c_err] = errors.into_array();
        ErrorsNone { a_err, x_c_err }
    }
}

impl<Scalar: Float + FloatConst> GaussianErrResolve<Scalar, true> for GaussianErrResolver {
    type T = ErrorsSigma<Scalar>;

    fn create(
        errors: generic_array::GenericArray<
                Scalar,
                <<SymmetricGenericGaussian<Scalar, true> as FitModel>::ParamCount as generic_array_storage::Conv>::TNum,
            >,
    ) -> Self::T {
        let [a_err, s_err, x_c_err] = errors.into_array();
        ErrorsSigma {
            a_err,
            s_err,
            x_c_err,
        }
    }
}