-
Notifications
You must be signed in to change notification settings - Fork 9
Open
Description
Hello, I'm using this package through LsqFit.jl. I have a 3d parameter vector, and would like to speed up the code by leveraging StaticArrays.jl, which basically come for free by passing a StaticVector instead of a Vector. In order to support in-place operations, we can further pass an MVector, i.e. a modifiable statically sized array. However, as seen below, Static Arrays always lead to ImmutableDiffResults.
DiffResults.jl/src/DiffResults.jl
Lines 31 to 52 in 80f085e
| """ | |
| DiffResult(value::Union{Number,AbstractArray}, derivs::Tuple{Vararg{Number}}) | |
| DiffResult(value::Union{Number,AbstractArray}, derivs::Tuple{Vararg{AbstractArray}}) | |
| Return `r::DiffResult`, with output value storage provided by `value` and output derivative | |
| storage provided by `derivs`. | |
| In reality, `DiffResult` is an abstract supertype of two concrete types, `MutableDiffResult` | |
| and `ImmutableDiffResult`. If all `value`/`derivs` are all `Number`s or `StaticArray`s, | |
| then `r` will be immutable (i.e. `r::ImmutableDiffResult`). Otherwise, `r` will be mutable | |
| (i.e. `r::MutableDiffResult`). | |
| Note that `derivs` can be provide in splatted form, i.e. `DiffResult(value, derivs...)`. | |
| """ | |
| DiffResult | |
| DiffResult(value::Number, derivs::Tuple{Vararg{Number}}) = ImmutableDiffResult(value, derivs) | |
| DiffResult(value::Number, derivs::Tuple{Vararg{StaticArray}}) = ImmutableDiffResult(value, derivs) | |
| DiffResult(value::StaticArray, derivs::Tuple{Vararg{StaticArray}}) = ImmutableDiffResult(value, derivs) | |
| DiffResult(value::Number, derivs::Tuple{Vararg{AbstractArray}}) = MutableDiffResult(value, derivs) | |
| DiffResult(value::AbstractArray, derivs::Tuple{Vararg{AbstractArray}}) = MutableDiffResult(value, derivs) | |
| DiffResult(value::Union{Number,AbstractArray}, derivs::Union{Number,AbstractArray}...) = DiffResult(value, derivs) |
I've done the following overloads to make it work for my case:
DiffResult(value::MArray, derivs::Tuple{Vararg{MArray}}) = MutableDiffResult(value, derivs)
DiffResult(value::Union{Number, AbstractArray}, derivs::Tuple{Vararg{MVector}}) = MutableDiffResult(value, derivs)I think this is a useful feature and currently can be considered a bug. If there's interest in merging this I can also open a PR.
Metadata
Metadata
Assignees
Labels
No labels