Proposal: Adopt scipy Sobol and deprecate `sample.saltelli`
Scipy now offers a Sobol' sampling method which includes scrambling and supports a more computationally efficient approach to continuing an existing design (skipping values).
I propose we wrap the scipy method which would effectively resolve #450 and #479.
Leveraging the scipy implementation would allow us to focus on additional Sobol approaches not currently available elsewhere, such as #478.
Implications:
- The sobol analysis method may need adjustment.
- The additional functionality offered by the scipy method (e.g., discrepancy criterion, sampler resetting, and others) would not be directly accessible for those using the procedural approach. There may be ways to mitigate this, however.
- Additional infrastructure would need to be designed for the object-oriented interface, although this may be relatively minor
- If this proposal is adopted, the current
sample.saltellimethod would be deprecated rather than modified to maintain backward compatibility. I suggest removing the saltelli implementation in v2.0
Additional dependencies: None, as Scipy is already a dependency
pinging @tupui @Xifus @sahin-abdullah in case they have thoughts
If you need help with the implementation, happy to give a hand. Feel free to ping me.
If wanted, I am interested in doing the work to replace the Sobol' code with a wrapper around SciPy. This would mean bumping the requirement to SciPy 1.7 which in turns would require updating minimal Python to 3.7. And here I would suggest updating to Python >=3.8 as all PyData stack is now doing (following NEP29).
#478 looks interesting. I will make some tests and if it's a good method I will consider it for SciPy itself.
Hi @tupui
We'd be appreciative of any contributions you are willing to make, it would be great!
In terms of project housekeeping, I'm currently leaning towards exposing the SciPy implementation as a separate method for now, purely for backwards compatibility and to avoid any unexpected behavioural changes for projects that depend on SALib. A future deprecation warning for the current implementation would also be added at this stage.
For v1.5 we can then rename the current implementation (something like saltelli_classic) and make the SciPy version the default and, if all goes well, finally remove the original implementation completely in v2.0