Add BinningAlgorithm algo type
We currently handle choice of default binning differently in bat_marginalmode and bat_marginalize. We should add BinningAlgorithm as a new super-type for auto-binning algorithms (and also offer user-specified fixed binning).
I think I can take a look at this, maybe together with @VasylHafych, to harmonize our efforts from marginal mode and plotting in this new type.
Thanks! We can split _auto_binning_nbins among separate subtypes of AbstractBinningAlgorithm, and have a FixedBinning too or so. Of course we should allow AbstractArrays and NamedTuples of binning algos (like you already implemented for plotting) so the user can specify binning in a per-parameter fashion.
Ok, so just to make sure I understand what you propose:
We will add a AbstractBinningAlgorithm as a supertype for the different automatic binnings, like Freedman–Diaconis and so on.
These types could then be passed to plot and bat_marginalize as a keyword argument like plot(samples, :a, bins=FD()) and would trigger the right version of _auto_binning_nbins.
But how exactly should we handle user-defined binning, like fixed number of bins or bin edges. Should it be possible to pass them directly as Ints and Ranges, like currently in plotting: plot(samples, bins=(200, -1:.01:1))?
Or would these need to be put into a subtype like FixedBinning, so that plot(samples, bins = FixedBinning(200, -1:0.1:1)) ?
Yes, that's the idea. FixedBinning would indeed be a subtype of AbstractBinningAlgorithm.
To make life more comfortable for the users, we should define Base.conv(::Type{AbstractBinningAlgorithm}, x) for symbols (e.g. :fd gets converted to Freedman–Diaconis()), scalars (like 500 means 500 bins, ends of range auto-adjusted) and ranges (0:0.2:1000 will be converted to an instance of FixedBinning).