# Common API for \`Integrate\`. IntegrationBase

**URL:** <https://discourse.julialang.org/t/common-api-for-integrate-integrationbase/130637>\
**Category:** General Usage\
**Tags:** api, math, interface, integral\
**Created:** [July 11, 2025, 9:41am UTC](https://discourse.julialang.org/t/common-api-for-integrate-integrationbase/130637 "2025-07-11T09:41:13Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![misha\_mikhasenko](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/misha_mikhasenko/32/5060_2.png) [@misha\_mikhasenko](https://discourse.julialang.org/u/misha_mikhasenko)\
**Post date:** [July 11, 2025, 9:41am UTC](https://discourse.julialang.org/t/common-api-for-integrate-integrationbase/130637/1 "2025-07-11T09:41:13Z")

</div>

I’ve observed a conflict of different packages exporting `integrate` ([e.g.](https://github.com/Moelf/FHist.jl/issues/163)).

It would be nice to have `IntegrationBase` with API.  
Currently, the ecosystem is diverse.

## Overview of methods

- `integrate` is exported by Polynomial
- in Distributions.jl, it’s called `cdf` 🙂
- [FHist.jl](https://github.com/Moelf/FHist.jl) exports `integral`,
- [NumericalDistributions.jl](https://github.com/mmikhasenko/NumericalDistributions.jl) export `integral`

## Need

I’d be happy to make dependency on `IntegrationBase`, and define

```julia
integrate(o::MyObject, domain::Domain)

```

Thoughts are welcome. Please point any relevant discussions.

EDIT:  
the question is not packages dedicated to the integration,

- `quadgk`
- `hcubature` of [HCubature.jl](https://github.com/JuliaMath/HCubature.jl)
- `nintegrate` of [NIntegration.jl](https://github.com/pabloferz/NIntegration.jl)
- `Integrals.jl` does different stuff

---

<div class="post-metadata">

**Author:** ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)\
**Post date:** [July 11, 2025, 10:01am UTC](https://discourse.julialang.org/t/common-api-for-integrate-integrationbase/130637/2 "2025-07-11T10:01:16Z")

</div>

These types of “Base packages” with a single function in them don’t really work because of how different their APIs are and what they expect their inputs to be.

If you want it to be useful, you can take inspiration from [GitHub - SciML/LinearSolve.jl: LinearSolve.jl: High-Performance Unified Interface for Linear Solvers in Julia. Easily switch between factorization and Krylov methods, add preconditioners, and all in one interface.](https://github.com/SciML/LinearSolve.jl), which provides a common API to different linear solvers (but then actually does the work to adapt to the different solvers API).

---

<div class="post-metadata">

**Author:** ![mbauman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mbauman/32/31082_2.png) [@mbauman](https://discourse.julialang.org/u/mbauman)\
**Post date:** [July 11, 2025, 1:39pm UTC](https://discourse.julialang.org/t/common-api-for-integrate-integrationbase/130637/3 "2025-07-11T13:39:32Z")

</div>

There’s also not necessarily any problem with export conflicts.

Another alternative comes from the IO and plotting ecosystems. Lots of packages define `Package.read` and `Package.write` or `Package.plot` with similar APIs. This allows you to swap out the method used in, e.g., `HCubature.integrate(sin, 0.0, 1pi)` to `Trapz.integrate(sin, 0.0, 1pi)` or whatever.

---

<div class="post-metadata">

**Author:** ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)\
**Post date:** [July 11, 2025, 3:12pm UTC](https://discourse.julialang.org/t/common-api-for-integrate-integrationbase/130637/4 "2025-07-11T15:12:54Z")

</div>

> [@kristoffer.carlsson](#):
>
> If you want it to be useful, you can take inspiration from [GitHub - SciML/LinearSolve.jl: LinearSolve.jl: High-Performance Unified Interface for Linear Solvers in Julia. Easily switch between factorization and Krylov methods, add preconditioners, and all in one interface.](https://github.com/SciML/LinearSolve.jl), which provides a common API to different linear solvers (but then actually does the work to adapt to the different solvers API).

Isn’t this what Integrals.jl does? It wraps a [bunch of different quadrature packages](https://docs.sciml.ai/Integrals/stable/solvers/IntegralSolvers/#Integrals.QuadGKJL) already.

---

<div class="post-metadata">

**Author:** ![misha\_mikhasenko](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/misha_mikhasenko/32/5060_2.png) [@misha\_mikhasenko](https://discourse.julialang.org/u/misha_mikhasenko)\
**Post date:** [July 11, 2025, 3:18pm UTC](https://discourse.julialang.org/t/common-api-for-integrate-integrationbase/130637/5 "2025-07-11T15:18:07Z")

</div>

Ok, I see the benefits of same name, even without a common base interface.  
My original concern comes from example of not-integration packages that still export integral method, like

- histogram can be integrated, therefore `FHist` defines `integrate`,
- Polynomials can be integrated, therefore `Polynomials.jl` export `integrate`.

My question is not on genuite integration libraries, rather on defining `integrate` on user objects.

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [July 11, 2025, 6:30pm UTC](https://discourse.julialang.org/t/common-api-for-integrate-integrationbase/130637/6 "2025-07-11T18:30:02Z")

</div>

> [@stevengj](#):
>
> Isn’t this what [Integrals.jl](https://juliaregistries.github.io/General/packages/redirect_to_repo/Integrals) does? It wraps a [bunch of different quadrature packages](https://docs.sciml.ai/Integrals/stable/solvers/IntegralSolvers/#Integrals.QuadGKJL) already.

Yup and it adds AD support on top of the interface too! So 😅 open an issue if it’s missing anything.
