On 12.04.2012 18:45, Joseph Rushton Wakeling wrote:
Hello all,

Hello there,

[snip]


So, introduction away, here are the main questions I came up with in
creating the code.

(1) Effective handling of random numbers.
----
The design concept was for the sampler classes to use a specified
uniform random number generator if provided, otherwise to use rndGen.
This turned out to be trickier than anticipated, and I'm not very happy
with the current solution.

My first attempt just templatized class methods select() and skip().
However, one of the algorithms (class VitterD) requires random
initialization as well, and trying to template this() ran into this bug:
http://d.puremagic.com/issues/show_bug.cgi?id=435

I'm really not too happy with turning the whole class into a template
just for the sake of the random number generator, so can anyone suggest
an effective way to resolve the problem?

(I may be biased here by C/GSL experience, where I've got used to
passing the RNG as a pointer, meaning runtime polymorphism.)

I think that if you like function pointer thing, you'd love D's delegates and lambdas. If templates are too pervasive it might be better just use little bit of dynamic stuff.
e.g.

Mt19937 gen;
double delegate() rng = (){
        auto x = gen.front;
        gen.popFron();
        return x;
}

use it somewhere later on:
writeln(rng(), rng()); // print 2 random numbers


(2) init() function?
----
I was unsure whether it would be good design practice for the sampler
classes to be throwaway (1 instance = 1 use) or to put in place an
init() function that would reset it with new record and sample sizes.
Any thoughts?

Use structs? They are cheap throwway value types allocated on stack (by default).


(3) Uniform random number on (0,1)
----
The algorithms' specification explicitly refers to uniform random
numbers on the open interval, which I take to mean (0,1) i.e. excluding
zero. Phobos currently provides only a half-open uniform distribution on
[a,b).

I've implemented a simple uniform_open() function which should return a
uniform distribution on (a,b). The question is, are there any plans for
an open-interval uniform distribution in Phobos? Can I rely on this
functionality being provided in the long term in D's standard library?

(4) Truncation
----
The code uses C's trunc() function to return the integer part of a
floating point number. D doesn't seem to like it very much when I then
set a size_t as equal to the result of trunc(), and I have to use a type
cast. Is there a more elegant D-ish way of achieving the same result?
roundTo() isn't adequate, as it rounds to the _nearest_ integer rather
than the integer part.


It's OK. there are no implicit conversions of FP--> integer in the language I think.

(5) ... any general stylistic comments? :-)


Looks fine ;)

Thanks and best wishes,

-- Joe


--
Dmitry Olshansky

Reply via email to