On Wednesday, 23 November 2016 at 16:54:44 UTC, Andrei Alexandrescu wrote:
On 11/23/2016 10:52 AM, Ilya Yaroshenko wrote:
I started with Engines as basis. The library will be very different comparing with Phobos and _any_ other RNG libraries in terms of floating
point generation quality. All FP generation I have seen are not
saturated (amount of possible unique FP values are very small comparing with ideal situation because of IEEE arithmetic). I have not found the idea described by others, so it may be an article in the future.

Is this a design matter, or an implementation matter? Could you implement the superior FP generation on the existing std.random API? To not be able to vs. to not want to is a different matter; I have an appreciation for each, but we need to clarify. -- Andrei

Floating point generation are implementation matter. Distributions and algorithms are design matter.

Assume your are building a modification Mod_X ~ 1 / X + X for a distribution. This is how it will look in Mir Random:

-------------------------

struct Mod(D)
  if(isRandomVariable!D && isFloatingPoint!(ReturnType!D))
{
    D irv;
    alias irv this;
    ReturnType!D opCall(G)(ref G gen)
        if(isSURBG!D)
    {
        ReturnType!D x1 = void;
        do x1 = irv(gen);
        while(x1 == 0);
        ReturnType!D x2 = irv(gen);
///////////////////////////////////////////////////////////////////////// ///////////////// X1 and X2 are independent! /////////////// ////////////////////////////////////////////////////////////////////////
        return 1 / x1 + x2;
    }
}

unittest
{
    auto gen = Xorshift(1);
    auto rv = Mod!GammaRandomVariable(...);
    auto x = rv(gen); /// generator is never copied by value.
}

-------------------------

How it can be done with Range interface instead of opCall?
Please note that users would use Distributions, not Engines.

So, Range API requirements are:

1. Engine must not have implicit copy semantic: it is not correct for RNGs and has performance issues. They also should not be copied explicitly in this example.

2. Do not use Engine's pointers in RandomVariable, because RandomVariables can be passed easily outside of function: they are just a small tuples of params.

3. Do not use classes because of BetterC and performance issues.

4. Engines must have Range interface

5. RandomVariables (both Mod and an underlaying) must have Range interface.

I don't think Range API for random variables can be done easily and without performance or security issues.

Thanks,
Ilya

Reply via email to