Comments (7)
Yes, Cubature works much more in-place for vector-valued integrands than HCubature. It's not just a matter of providing an in-place integrand function, however — a lot of other parts of the code would need to be reworked to operate in-place.
@ChrisRackauckas, do you have any advice here from your experience with DifferentialEquations? .=
doesn't work for scalars or other immutables, so I'm not sure what's the best way to write code that is in-place for vectors but also works for scalars.
(A lot of realistic problems involve more expensive integrands, so that the overhead of the extra allocations matters less.)
from hcubature.jl.
The basic code that would have to be duplicated is the rule evaluation, e.g. here.
We could use a type parameter in the rule construction to say whether we want an in-place rule or not.
I don't think we need to look at the method table. Probably we could just have an interface hcubature!
where the user passes a pre-allocated array to store the integrals, and in this interface we could assume they also passed an in-place function f!(result, x)
, and then pass a parameter to the low-level _hcubature
routine to construct this version of the rule
.
from hcubature.jl.
I don't have good advice, but I can tell you how we do it in DifferentialEquations.jl. It's not really possible to handle in-place and out-of-place in a single set of functions, so in the internals of the time stepping we have both versions, one optimized for the static array and reverse-mode AD case (since reverse-mode is another case where the array-based operations allocating is helpful), while the other is a fully non-allocating mutating case. For example, look at the implementation of Dormand-Prince:
My idea here is that, in the library we might as well code the fastest thing we can until the compiler can handle it better, but it can't right now. There's too much if inplace, @. x = y else x = @. y
and all of those other edge cases. And you cannot determine it from type information. For example, with reverse-mode AD on Array you want to use out-of-place instead of in-place, so it needs to be a user choice. And in a higher order function, you need to change dx = f(x)
vs f!(dx,x)
(though in theory you could have an API of dx = f!(dx,x)
, but that sounds bug-prone IMO).
The next thing to address then is how to automatically detect this. What we do is look at the current method table:
https://github.com/SciML/DiffEqBase.jl/blob/master/src/utils.jl#L1-L46
and then use this to place a type-parameter in the problem construction:
https://github.com/SciML/DiffEqBase.jl/blob/master/src/problems/ode_problems.jl#L72
So then it's type-information after that point. That lets the user override it if necessary, and lets the user add it as a literal to make it type stable. While it feels a little hacky, in practice we've been doing this for 4 years and no one has really ever complained. The breaking scenario is that a user defines f(u,p,t)
, then f(du,u,p,t)
, and then wants the out-of-place behavior but is unwilling to write ODEProblem{false}(...)
. In theory that could happen, but it's not something that has shown up in user issues (because normally it's f
vs f!
, etc.) so it has generally worked with only very light documentation of the fact that it could be overrode.
One other semi-important detail is that we pair this with a separate broadcast implementation (@..
) which forces @simd ivdep
for the internal uses where we know the arrays do not alias, and this allows all of the internal operations to be broadcasting and thus support GPUs as well without losing optimality on CPUs.
That's probably not as elegant of an answer as you were hoping for, but I think it's the only real answer to get the most optimal dispatches for the two cases until there's better lifetime management and array freezing in the compiler.
from hcubature.jl.
I understand only the first part of your answer and I can try to write a PR to do in-place mutation.
from hcubature.jl.
Yes, I agree that in this use case it's overkill to do the methods table reading. (and probably in DiffEq, but by now the interface is set in stone).
from hcubature.jl.
If I understand correctly, there should be a function (g::GenzMalik{n,T})(result::AbstractVector{T}, f, a::AbstractVector{T}, b::AbstractVector{T}, norm=norm) where {T}
that duplicates the current code for in-place mutation.
from hcubature.jl.
Yes, probably by adding a type parameter to GenzMalik
indicating whether it is in place.
from hcubature.jl.
Related Issues (20)
- non rectangular integral HOT 4
- Parallel evaluation of the integrand
- Check for NaN?
- Promotion of endpoints to a common type? HOT 4
- Internal error got on Julia1.2.0
- Error estimation HOT 2
- Bounds order while using hquadrature HOT 4
- Incorrect and variable results for smooth function depending on initdiv HOT 1
- Parallel integrand evaluation [Feature Req.] HOT 2
- Inconsistent results for Inf integrands HOT 3
- TagBot trigger issue HOT 29
- Type instability when using a vector for the limits. HOT 1
- Mimic `Cubature.INDIVIDUAL` behavior [Feature Req.] HOT 6
- Question about 2D integral with a complex function f HOT 6
- A question regarding nodes and weights in hcubature HOT 1
- Any plans to add Symbolics.jl inside HCubature.jl? HOT 1
- Performance versus `quadgk` HOT 1
- hcubature not type stable HOT 2
- GPU support HOT 2
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 hcubature.jl.