Skip to content

[AUD-016][High] Propagate QR rank failure from regression APIs #317

Description

@gabrielsantosphilips

Audit finding

  • ID: AUD-016
  • Status: Verified defect
  • Severity: High
  • Confidence: High
  • Audited revision: 2f479320d805a1f9f35ebe4afaaeeded48913a94

Problem

Linear and polynomial regression call QrDecomposition::Decompose() but discard its Boolean result before back substitution. Constant/collinear feature columns and repeated abscissae reach zero-diagonal triangular solves. Their void Fit() APIs cannot report failure.

Sources:

  • qr.Decompose(X_design);
    coefficients = qr.SolveLeastSquares(y);
    }
    template<typename T, std::size_t Samples, std::size_t Features>
    OPTIMIZE_FOR_SPEED
    T
    LinearRegression<T, Samples, Features>::Predict(const InputMatrix& X) const
    {
    T result = coefficients.at(0, 0);
    for (size_t i = 0; i < Features; ++i)
    result += X.at(i, 0) * coefficients.at(i + 1, 0);
    return result;
    }
    template<typename T, std::size_t Samples, std::size_t Features>
    const typename LinearRegression<T, Samples, Features>::CoefficientsMatrix& LinearRegression<T, Samples, Features>::Coefficients() const
  • qr.Decompose(v);
    coefficients = qr.SolveLeastSquares(y);
    }
    template<typename T, std::size_t Samples, std::size_t Degree>
    T PolynomialFitting<T, Samples, Degree>::Predict(T xVal) const
    {
    T acc = coefficients.at(Degree, 0);
    for (std::size_t j = Degree; j > 0; --j)
    acc = acc * xVal + coefficients.at(j - 1, 0);
    return acc;
    }
    template<typename T, std::size_t Samples, std::size_t Degree>
    const typename PolynomialFitting<T, Samples, Degree>::CoefficientsVector&
    PolynomialFitting<T, Samples, Degree>::Coefficients() const
    {
    return coefficients;

Acceptance criteria

  • Fit() exposes explicit success/failure or returns an optional result.
  • Failed QR decomposition never proceeds to solve.
  • Prior coefficients remain well-defined after failure.
  • Add independent rank-deficient, repeated-abscissa, and near-collinear tests.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions