Comments (5)
I am not sure there's a good reason. Somewhere there was an issue complaining about this kind of behaviour, and my memory is that most were horrified that values could alter sparsity in something like this:
julia> x = sparse([1.0]);
julia> x .*= 0;
julia> x
1-element SparseArrays.SparseVector{Float64, Int64} with 0 stored entries
(May have had some mistakes above at first, sorry.)
from forwarddiff.jl.
For reference: JuliaSparse/SparseArrays.jl#190
from forwarddiff.jl.
The answer here is changed by #481:
julia> derivative(t -> x + t * dx - x, 0) # was zero above
1-element SparseArrays.SparseVector{Float64, Int64} with 1 stored entry:
[1] = 1.0
(jl_PuuLcA) pkg> st ForwardDiff
Status `/private/var/folders/yq/4p2zwd614y59gszh7y9ypyhh0000gn/T/jl_PuuLcA/Project.toml`
[f6369f11] ForwardDiff v0.11.0-DEV `https://github.com/JuliaDiff/ForwardDiff.jl.git#master`
However, it's not entirely clear to me what the right behaviour is. It depends whether you think the sparse array is just a compact representation of a dense array or whether you think the sparsity information is structural, e.g. a sparse matrix represents a graph.
ChainRules takes the latter view, that the location of zeros is a structural feature like Diagonal. In this case, the bug in this particular example is that x
's structure is that it has one nonzero entry, but this is lost by the function t -> x + t * dx - x
, which promotes an accidental zero to a structural feature.
julia> let t = 0
x + t * dx - x
end
1-element SparseArrays.SparseVector{Float64, Int64} with 0 stored entries
julia> let t = eps()
x + t * dx - x
end
1-element SparseArrays.SparseVector{Float64, Int64} with 1 stored entry:
[1] = 2.22045e-16
Edit: The reason 481 works here is that it alters the check SparseArrays is using to decide whether to drop the zero. Even if we think the let t = 0
answer is a bug, the Dual case seems correct:
julia> let t = ForwardDiff.Dual(0, 1)
x + t * dx - x
end
1-element SparseArrays.SparseVector{ForwardDiff.Dual{Nothing, Float64, 1}, Int64} with 1 stored entry:
[1] = Dual{Nothing}(0.0,1.0)
from forwarddiff.jl.
Your explanation makes sense, and I also think that the zeros should be structural (so I actuall end up disagreeing with the upcoming release 🤣)
Perhaps my real gripe is that x - x
doesn't have the same sparsity structure as x
. But I imagine there is a good reason?
from forwarddiff.jl.
I'll try to dig up the issue, wanna add to the outrage
from forwarddiff.jl.
Related Issues (20)
- Implement hessian! for scalar x
- Implement gammalogccdf for ForwardDiff HOT 1
- `ForwardDiff.jacobian` throws error for `fft` HOT 1
- Correctly forming nested dual numbers. HOT 8
- Derivative of a function of derivatives HOT 7
- Symbolics.jl compatibility HOT 1
- Support derivative(f, ::Complex) HOT 1
- `ForwardDiff` fails to compute correct derivative HOT 3
- Incorrect Hessian by `exp` function HOT 1
- Method ambiguities reported by Aqua HOT 3
- Document internals? HOT 1
- Bug (NaNs) when differentiating eigenvectors of Symmetric matrices
- Error requiring `Symbolics` from `Optimization` HOT 1
- promote_rule ambiguity with AbstractIrrational and ForwardDiff.Dual HOT 2
- Allocation tests broken since Julia 1.9
- LoadError: ArgumentError: Package AdaptStaticArraysCoreExt does not have Adapt in its dependencies: HOT 2
- Working with anonymous functions HOT 2
- DiffResults objects are not re-aliased properly HOT 2
- `gradient!` allocates for matrices but not for vectors
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from forwarddiff.jl.