-
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 ImmutableDiffResult
s.
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