Skip to content

NonlinearObjectiveFunction.SetObserved method throws overflow exception for large weighted vectors #926

Open
@AutWint

Description

@AutWint

I'm using the NonlinearObjectiveModel for nonlinear least squares fitting of weighted data. However, the fitting fails due to an overflow exception when the number of data points becomes too large (let's say, 10000+).

The origin of this exception is the SetObserved method in the NonlinearObjectiveFunction. At the end of this method, a DenseMatrix is constructed for the data point weights, although this matrix contains diagonal elements only. The dense matrix stores all (10000+)^2 (mostly zero) entries, which exceeds my memory. To my mind, a DiagonalMatrix would be the better choice here.

I've tested replacing line 217-219 with

Weights = (weights == null)
    ? null
    : Matrix<double>.Build.DiagonalOfDiagonalVector(weights);

... and it solves my issue. I also tested this for small data (10 points) and didn't notice any performance declines there either.

Is there any reason for hanging on to the DenseMatrix? If not, I would suggest modifying the mentioned lines as described. I'm happy to great a pull request for this.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions